ACM_Bellman-fordアルゴリズム


Bellman_fordアルゴリズム:単一ソースを求める最短パスでもあり、Dijkstraアルゴリズムとの違いは、負の重み値エッジの存在をチェックできることです.負の重み値のエッジがあれば、最短パスは存在しません.1つの数+負の数で、必ず小さくなるので、dis配列は更新されます.
#include
#include
using namespace std;
#define INF 9999999
struct node
{
    int u,v,w;
};//        ,u,v,w          
struct node a[109];
int n,m,dis[109],t;//n  ,m  ,dis[i]      s i     
bool bellman_ford(int s)//  s
{
    int i,j;
    bool flag = true;//bool   ,            
    dis[s] = 0;//         0,         ,     ,   
    //dis      
    for (i = 1; i <= n-1; ++i)//     ,  for  ,           
        //   ,  n  ,          n-1  ,    n-1  OK
    {
        for (j = 1; j <= 2*m; ++j)//m  ,      ,   2m
        {
            if (dis[a[j].u] > dis[a[j].v] + a[j].w)//    dis[s]=0,dis      
                dis[a[j].u] = dis[a[j].v] + a[j].w;
        }
    }
    for (j = 1; j <= 2*m; ++j)
    {
        if (dis[a[j].u] > dis[a[j].v] + a[j].w)//       +  ,     ,    ,  
            //   ,            
        {
            flag = false;
            break;
        }
    }
    return flag;
}
int main()
{
    int i,j,s,d,u,v,w;
    while (~scanf("%d%d",&n,&m))
    {
        for (i = 1; i <= n; ++i)
            dis[i] = INF;
        j = 1;
        t = m;
        while (t--)
        {
            scanf("%d%d%d",&u,&v,&w);
            a[j].u = u;
            a[j].v = v;
            a[j++].w = w;
            a[j].u = v;
            a[j].v = u;
            a[j++].w = w;
        }//      ,    
        scanf("%d%d",&s,&d);//s   ,d   
        if (bellman_ford(s))
            printf("%d
",dis[d]); else printf("sorry
"); } return 0; } /* ! , , (1) (2) 5 7 4 4 1 2 100 1 2 -9 1 5 10 2 3 1 1 3 30 3 4 2 2 3 60 4 1 3 2 4 10 1 2 3 4 60 (sorry) 4 5 50 1 4 (60) ! */