poj 3268(spfa)

http://poj.org/problem?id=3268

对于这道题,我想说的就是日了狗了,什么鬼,定义的一个数值的前后顺序不同,一个就TLE,一个就A,还16MS。

感觉人生观都奔溃了,果然,题目做多了总会见到鬼的!!!!!!

心累,不想写这个题了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 #include <iostream>
 5 #define inf 0x3f
 6 #define Max1 1010
 7 #define Max2 100010
 8 
 9 using namespace std;
10 int m,n,x;
11 int mark[Max1];
12 int next[Max1];
13 int u[Max2];                       //把13和14行交换一下,你得到了结果会完全不同。。
14 int v[Max2];
15 int w[Max2];
16 int a[Max2],b[Max2],c[Max2];
17 int dist[Max1];
18 int ans[Max1];
19 bool vis[Max1];
20 
21 
22 queue <int >s;
23 void init()
24 {
25     memset( vis,false,sizeof(vis));
26     while( !s.empty()) s.pop();
27     memset(dist,inf,sizeof( dist ));
28     dist[x]=0;
29     for(int i=1;i<=n;i++)
30     mark[i]=-1;
31 }
32 
33 void spfa()
34 {
35     s.push( x );
36     vis[ x ] = true ;
37     while( !s.empty() )
38     {
39         int tmp = s.front();
40         s.pop();
41         vis[ tmp ] = false;
42         for(int i = mark[ tmp ] ; i != -1 ; i = next[ i ] )
43         {
44             if( dist[ tmp ] + w[ i ] < dist[ v[ i ] ])
45             {
46                 dist[ v[ i ] ] = dist[ tmp ] + w[ i ];
47                 if( !vis[ v[ i ] ] )
48                 {
49                     s.push( v[ i ] );
50                     vis[ v[ i ] ] = true;
51                 }
52             }
53         }
54     }
55     for( int i = 1 ; i <= n ; i++ )
56         ans[ i ] += dist[ i ];
57 }
58 
59 int main()
60 {
61  //   freopen("in.txt","r",stdin);
62     while(~scanf("%d%d%d",&n,&m,&x))
63     {
64         memset( ans , 0 , sizeof( ans ) );
65         init();
66         for( int i = 1 ; i <= m ; i++ )
67         {
68             scanf( "%d%d%d",&a[ i ],&b[ i ],&c[ i ] );
69             u[ i ] = a[ i ];
70             v[ i ] = b[ i ];
71             w[ i ] = c[ i ];
72             next[ i ] = mark [ u[ i ] ] ;
73             mark[ u[ i ] ] = i;
74         }
75         spfa();
76         init();
77         for( int i = 1 ; i <= m ; i++ )
78         {
79             v[ i ] = a[ i ];
80             u[ i ] = b[ i ];
81             w[ i ] = c[ i ];
82             next[ i ] = mark[ u[ i ] ];
83             mark[ u[ i ] ] = i;
84         }
85         spfa();
86         int Max = ans[1];
87         for( int i = 2 ; i <= n ; i++ )
88             if( ans[ i ] > Max ) Max = ans[ i ];
89         printf("%d\n",Max);
90     }
91     return 0;
92 }

 

posted @ 2016-08-04 17:23  一个_小菜鸟  阅读(140)  评论(0编辑  收藏  举报