标签:
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 }
标签:
原文地址:http://www.cnblogs.com/Tree-dream/p/5737567.html