码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1874 畅通工程续

时间:2016-07-29 16:44:12      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:

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

 

poj 1874 畅通工程续

标签:

原文地址:http://www.cnblogs.com/biu-biu-biu-/p/5718836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!