记录编号 43664 评测结果 AAAAAAAAA
题目名称 [NOIP 2010冲刺七]最长路 最终得分 100
用户昵称 Gravatar万里长城 是否通过 通过
代码语言 C++ 运行时间 0.032 s
提交时间 2012-10-12 13:10:38 内存使用 0.90 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <deque>
#include <cmath>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define clr(x, n) memset(x, n, sizeof(x))
#define inf 0x7fffffff
#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);
}

struct alist {
	int v, w, next;
};

alist map[50005];
int head[maxn];
int n, m;
int dis[maxn];
bool visit[maxn];
deque<int> que;

void init() {
	clr(dis, 0);
	clr(visit, false);
	clr(head, -1);
	scanf("%d%d", &n, &m);
	int x, y, z;
	rep(i, m) {
		scanf("%d%d%d", &x, &y, &z);
		x--;
		y--;
		map[i].v = y;
		map[i].w = -z;
		map[i].next = head[x];
		head[x] = i;
	}
}

void insert(int x) {
	if (!visit[x]) {
		visit[x] = true;
		if (que.empty()) {
			que.push_back(x);
			return;
		}
		int t = que.front();
		if (dis[t] <= dis[x]) que.push_back(x);
		else que.push_front(x);
	}
}

void spfa() {
        insert(0);
        while(!que.empty()) {
                int t = que.front();
                int p = head[t];
		visit[t] = false;
                que.pop_front();
                while(p != -1) {
                        if (dis[t] + map[p].w < dis[map[p].v]) {
                                dis[map[p].v] = dis[t] +  map[p].w;
                                insert(map[p].v);
                        }
                        p = map[p].next;
                }
        }
}

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;
}