poj 3259

来源:互联网 发布:怎么让眼白变清澈知乎 编辑:程序博客网 时间:2024/05/18 02:10

终于可以睡了,一道模板题没想到也能犯那么多的错的。。不过收获不少~大笑

/*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;}