又是被题意纠结了N久的水题。。。真是坑爹。。
/* zoj_3033 最短路 再次坑爹的觉得自己的理解能力最近好像出了问题。bellman过的。 Process: 首先,没看到it can lead to an infinitely high(there's no way the player can win the game) 以为无限大是要我判断正权回路。没想到只是判断简单的不可达。。 其次,觉得一个很坑爹的是这题居然用long long来卡人。。边权可能超过32位的。。 最后,我发现我彻底理解错了,不过还是觉得题目没写清楚啊。 举个例子:4 0 3 4 0 1 1 1 2 1 2 1 -2 0 3 1 这样的数据是输出infinity的。而我一直认为是要我判断sta和end之间有没有负权回路(见错误代码) 比如这组数据我的错误代码是输出1的。 好吧,最后总结一下,这题仅仅是要我们找到 是否存在负权回路 以及 起点和终点是否可达 的简单bellman模板题。。 */ #include <iostream> #include <cstdio> #include <limits.h> #define N 310 #define inf ( (long long)(1) )<<62 #define LL long long using namespace std; struct node { int sta,end; LL val; }map[N*N]; LL dist[N]; int n; void bellman( int from,int to,int k ) { int i,j,a,b; bool in; LL ori; for( i=0;i<=n;i++ ) dist[i]=inf; dist[from]=0; for( i=0;i<n;i++ ) { in=false; for( j=0;j<k;j++ ) { a=map[j].sta , b=map[j].end; if( dist[a]!=inf && dist[b]>dist[a]+map[j].val ) { dist[b]=dist[a]+map[j].val; in=true; } } if( !in ) break; } if( i==n || dist[to]==inf ) printf( "infinity\n" ); else printf( "%lld\n",dist[to] ); } int main() { int T,m,i,j,sta,end; int a,b; LL value; scanf( "%d",&T ); while( T-- ) { scanf( "%d%d%d%d",&n,&sta,&end,&m ); for( i=0;i<m;i++ ) scanf( "%d%d%lld",&map[i].sta,&map[i].end,&map[i].val ); bellman( sta,end,m ); } return 0; }
//wa //判断sta和end之间有没有负权回路我认为没有错的代码 #include <iostream> #include <cstdio> #include <limits.h> #define N 310 #define inf ( (long long)(1) )<<62 #define LL long long using namespace std; struct node { int sta,end; LL val; }map[100000]; LL dist[N]; int n; void bellman( int from,int to,int k ) { int i,j,a,b; bool in; LL ori; for( i=0;i<=n;i++ ) dist[i]=inf; dist[from]=0; for( i=1;i<n;i++ ) { in=false; for( j=0;j<k;j++ ) { a=map[j].sta , b=map[j].end; if( dist[a]!=inf && dist[b]>dist[a]+map[j].val ) { dist[b]=dist[a]+map[j].val; in=true; } } if( !in ) break; } ori=dist[to]; for( i=1;i<n;i++ ) { in=false; for( j=0;j<k;j++ ) { a=map[j].sta , b=map[j].end; if( dist[a]!=inf && dist[b]>dist[a]+map[j].val ) { dist[b]=dist[a]+map[j].val; in=true; } } if( !in ) break; } if( dist[to]!=ori || dist[to]==inf ) printf( "infinity\n" ); else printf( "%lld\n",dist[to] ); } int main() { int T,m,i,j,sta,end; int a,b; LL value; scanf( "%d",&T ); while( T-- ) { scanf( "%d%d%d%d",&n,&sta,&end,&m ); for( i=0;i<m;i++ ) scanf( "%d%d%lld",&map[i].sta,&map[i].end,&map[i].val ); bellman( sta,end,m ); } return 0; }