终于可以睡了,一道模板题没想到也能犯那么多的错的。。不过收获不少~
/*
poj_3259 最短路
模板题,第一次写bellman-ford,犯了N多错。。
注意:1.path是双向的,虫洞是单向的。
2.因为我用了INT_MAX, 此句 if( dist[a]!=INT_MAX && dist[b]>dist[a]+edge[j].value )
必须加 dist[a]!=INT_MAX ,否则会溢出。。
3.要找的是一条负权回路,而我一开始理解成松弛所有边n-1次后dist[1]为负即可。。
4.我一开始将dist数组初始化为0,这样显然不行,因为后面正负权边的叠加也可能出现0的情况。
*/
#include <iostream>
#include <cstdio>
#include <string.h>
#include <limits.h>
using namespace std;
int dist[510];
struct edgeinf
{
int sta,end,value;
void set( int i,int j,int k )
{
sta=i,end=j,value=k;
}
}edge[5500];
bool bellman( int n,int m )
{
int i,j,a,b;
bool in;
for( i=2;i<=n;i++ )
dist[i]=INT_MAX;
dist[1]=0;
for( i=1;i<=n;i++ )
{
in=false;
for( j=0;j<m;j++ )
{
a=edge[j].sta , b=edge[j].end;
if( dist[a]!=INT_MAX && dist[b]>dist[a]+edge[j].value )
dist[b]=dist[a]+edge[j].value , in=true;
}
if( !in ) break;
}
if( i==n+1 ) return true;
else return false;
}
int main()
{
int T,n,m,w,i,j;
int a,b,value;
scanf( "%d",&T );
while( T-- )
{
scanf( "%d%d%d",&n,&m,&w );
j=0;
for( i=0;i<m;i++ )
{
scanf( "%d%d%d",&a,&b,&value );
edge[j++].set( a,b,value );
edge[j++].set( b,a,value );
}
for( i=0;i<w;i++ )
{
scanf( "%d%d%d",&a,&b,&value );
edge[j++].set( a,b,-value );
}
if( bellman( n,j ) ) printf( "YES\n" );
else printf( "NO\n" );
}
return 0;
}
//用邻接矩阵的一种实现,效率很低。。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <limits.h>
using namespace std;
int map[510][510];
int dist[510];
void bellman( int n )
{
int i,j,k;
bool in;
memset( dist,0,sizeof(dist) );
for( i=1;i<=n;i++ )
{
in=false;
for( j=1;j<=n;j++ )
for( k=1;k<=n;k++ )
{
if( map[j][k]!=0 )
{
if( dist[j]!=INT_MAX && dist[k]>dist[j]+map[j][k] )
dist[k]=dist[j]+map[j][k] , in=true ;
}
}
if( !in ) break;
}
if( i==n+1 ) printf( "YES\n" );
else printf( "NO\n" );
}
int main()
{
int T,n,m,w,i,j;
int a,b,value;
scanf( "%d",&T );
while( T-- )
{
memset( map,0,sizeof(map) );
scanf( "%d%d%d",&n,&m,&w );
for( i=0;i<m;i++ )
{
scanf( "%d%d%d",&a,&b,&value );
if( map[a][b]==0 || map[a][b]>value )
{
map[a][b]=value;
map[b][a]=map[a][b];
}
}
for( i=0;i<w;i++ )
{
scanf( "%d%d%d",&a,&b,&value );
if( map[a][b]==0 || map[a][b]>-value )
map[a][b]=-value;
}
bellman(n);
}
return 0;
}