比赛 20121009 评测结果 AWWWWWAAA
题目名称 最长路 最终得分 44
用户昵称 万里长城 运行时间 0.080 s
代码语言 C++ 内存使用 11.92 MiB
提交时间 2012-10-09 19:59:34
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define clr(x, n) memset(x, n, sizeof(x))
#define maxn 1505
using namespace std;

void setIO(string name) {
        string in_f = name + ".in";
        string out_f = name + ".out";
        freopen(in_f.c_str(), "r", stdin);
        freopen(out_f.c_str(), "w", stdout);
}

int map[maxn][maxn];
int n, m;
int dis[maxn];
bool visit[maxn];
queue<int> que;

void init() {
        clr(dis, 0);
        clr(visit, false);
        scanf("%d%d", &n, &m);
        rep(i, n) rep(j, n) map[i][j] = 1000000001;
        int x, y, z;
        rep(i, m) {
                scanf("%d%d%d", &x, &y, &z);
                x--;
                y--;
                map[x][y] = -z;
        }
}

void insert(int x) {
        if (!visit[x]) que.push(x);
        visit[x] = true;
}

void spfa() {
        insert(0);
        while(!que.empty()) {
                int t = que.front();
                que.pop();
                rep(i, n) {
                        if (dis[t] + map[t][i] < dis[i]) {
                                dis[i] = dis[t] + map[t][i];
                                insert(i);
                        }
                }
                visit[t] = false;
        }
}

void output() {
        if (!dis[n - 1]) printf("%d\n", -1);
        else printf("%d\n", -dis[n - 1]);
}

void solve() {
        spfa();
        output();
}

int main() {
        setIO("longest");
        init();
        solve();
        return 0;
}