P1807 最长路_NOI导刊2010提高(07)--最长路

      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

 

 1 /*
 2     水题
 3     SPFA求最长路 
 4 */
 5 #include <queue>
 6 #include <ctype.h>
 7 #include <cstdio>
 8 
 9 const int MAXN=1510;
10 const int MAXM=50010;
11 const int INF=0x3f3f3f3f;
12 
13 int n,m;
14 
15 int dis[MAXN];
16 
17 bool vis[MAXN];
18 
19 struct WE {
20     int to;
21     int val;
22     int next;
23 };
24 WE e[MAXM<<1];
25 
26 int head[MAXN],tot;
27 
28 inline void read(int&x) {
29     int f=1;register char c=getchar();
30     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
31     for(;isdigit(c);x=x*10+c-48,c=getchar());
32     x=x*f;
33 }
34 
35 inline void add(int x,int y,int v) {
36     e[++tot].to=y;
37     e[tot].val=v;
38     e[tot].next=head[x];
39     head[x]=tot;
40 }
41 
42 void SPFA() {
43     std::queue<int> Q;
44     dis[1]=0;
45     Q.push(1);
46     while(!Q.empty()) {
47         int now=Q.front();
48         Q.pop();
49         vis[now]=false;
50         for(int i=head[now];i;i=e[i].next) {
51             int u=e[i].to;
52             if(dis[u]<dis[now]+e[i].val) {
53                 dis[u]=dis[now]+e[i].val;
54                 if(!vis[u]) Q.push(u),vis[u]=true;
55             }
56         }
57     }
58 }
59 
60 int hh() {
61     read(n);read(m);
62     for(int x,y,z;m--;) {
63         read(x);read(y);read(z);
64         if(x<y) add(x,y,z);
65     } 
66     for(int i=1;i<=n;++i) dis[i]=-1;
67     SPFA();
68     printf("%d\n",dis[n]);
69     return 0;
70 }
71 
72 int sb=hh();
73 int main() {;} 
代码

 

posted @ 2017-08-24 10:56  拿叉插猹哈  阅读(189)  评论(0编辑  收藏  举报