P1807 最长路_NOI导刊2010提高(07)
Posted HWIM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1807 最长路_NOI导刊2010提高(07)相关的知识,希望对你有一定的参考价值。
题目描述
设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j。设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径。
输入输出格式
输入格式:
输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v)。
输出格式:
输出文件longest.out,一个整数,即1到n之间的最长路径.如果1到n之间没连通,输出-1。
输入输出样例
输入样例#1:
2 1 1 2 1
输出样例#1:
1
说明
20%的数据,n≤100,m≤1000
40%的数据,n≤1,000,m≤10000
100%的数据,n≤1,500,m≤50000,最长路径不大于10^9
spfa最长路
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 const int MAXN = 1510; 7 8 struct Edge{ 9 int to,w,nxt; 10 }e[50100]; 11 12 int dis[MAXN]; 13 int head[MAXN]; 14 bool vis[MAXN]; 15 queue<int>q; 16 int n,m,cnt; 17 18 void add(int u,int v,int w) //从u到v有一条长度是w的边 19 { 20 ++cnt; 21 e[cnt].to = v; 22 e[cnt].w = w; 23 e[cnt].nxt = head[u]; 24 head[u] = cnt; 25 } 26 27 void spfa() 28 { 29 for (int i=1; i<=n; ++i) dis[i] = -1; 30 dis[1] = 0; 31 q.push(1); 32 vis[1] = true; 33 while (!q.empty()) 34 { 35 int u = q.front(); 36 q.pop(); 37 for (int i=head[u]; i; i=e[i].nxt) 38 { 39 int v = e[i].to; 40 int w = e[i].w; 41 if (dis[v]<dis[u]+w) 42 { 43 dis[v] = dis[u]+w; 44 if (!vis[v]) 45 { 46 q.push(v); 47 vis[v] = true; 48 } 49 } 50 } 51 vis[u] = false; 52 } 53 } 54 55 int main() 56 { 57 scanf("%d%d",&n,&m); 58 for (int u,v,w,i=1; i<=m; ++i) 59 { 60 scanf("%d%d%d",&u,&v,&w); 61 add(u,v,w); 62 } 63 spfa(); 64 printf("%d",dis[n]); 65 return 0; 66 }
以上是关于P1807 最长路_NOI导刊2010提高(07)的主要内容,如果未能解决你的问题,请参考以下文章