首页 > 其他 > 详细

Bellman-Ford

时间:2016-04-12 01:46:48      阅读:294      评论:0      收藏:0      [点我收藏+]

技术分享

 

技术分享

//Bellman-Ford 算法
#include<iostream>
using namespace std;
#define MAX_SIZE 100
#define MAX_NUMBER INT_MAX/2
struct Edge {
    int u, v;      //表示有向边<u,v>
    int w;    //边的权重
};
Edge edge[MAX_SIZE];
int dis[MAX_SIZE];
int parent[MAX_SIZE];
bool Bellman_Ford(int v, int e, int s);
int main() {
    /*测试*/
    int i,v,e, s;
    cin >> v >> e;        
    for (i = 0; i<e; i++)
        cin >> edge[i].u >> edge[i].v >> edge[i].w;
    cin >> s;
    bool flag = Bellman_Ford(v, e, s);
    for (i = 0; i<v; i++)
        cout << dis[i] << " ";
    cout << endl;
    return 0;
}
void Relax(Edge edge) {
    if (dis[edge.v] > dis[edge.u] + edge.w) {
        dis[edge.v] = dis[edge.u] + edge.w;
        parent[edge.v] = edge.u;
    }
}
bool Bellman_Ford(int v,int e,int s) {
    int i,j;
    for (i = 0; i < v; i++)
        dis[i] = MAX_NUMBER;
    parent[s] = -1;           //s设置为根结点
    dis[s] = 0;
    for (i = 1; i < v; i++) {    
        for (i = 0; i < e; i++)
            Relax(edge[i]);         //对每条边做一次松弛操作  
    }
    for (i = 0; i < e; i++) {    //检验路径长度是否收敛(是否有负环存在)
        if (dis[edge[i].v]>dis[edge[i].u] + edge[i].w)
            return false;
    }
    return true;
}

 

Bellman-Ford

原文:http://www.cnblogs.com/td15980891505/p/5380803.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!