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\n",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;
}

 

posted @ 2016-07-29 16:19  biu~biu~biu~  阅读(152)  评论(0编辑  收藏  举报