poj 1874 畅通工程续

 bellman-ford

算法解决的是一般情况下的单源最短路径问题,其边可以为负值。bellman-ford算法可以判断图是否存在负环,若存在负环会返回一个布尔值。当然在没有负环存在的情况下会返回所求的最短路径的值。

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f
#define N 11110
int dis[N];
int s,t,m,n;
struct point
{
    int u,v,w;
}p[N];
void bellman()
{
    dis[s] = 0;///源点初始化为0
    m = m<<1;///相当于m*2,因为是无向图
    for(int i=1;i<n;i++)///进行|v-1|次
    {
        int f = 0;
        for(int j=0;j<m;j++)
        {
            if(dis[p[j].u]>dis[p[j].v]+p[j].w)///松弛处理
            {
                dis[p[j].u]=dis[p[j].v]+p[j].w;
                f = 1;///松弛成功标记
            }

        }
        if(!f)///对所有的边都没有进行松弛的话直接跳出
            break;
    }

    printf("%d
",dis[t]==INF?-1:dis[t]);

}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        fill(dis,dis+N,INF);

        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
            p[i+m].v = p[i].u;
            p[i+m].u = p[i].v;
            p[i+m].w = p[i].w;

        }
        scanf("%d%d",&s,&t);
        bellman();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/biu-biu-biu-/p/5718836.html