看别人博客手敲的Bellman Ford模板

#include<cstdio>
#include<string.h>
//数组dis[maxn]记录从源点source到顶点v的路径长度,初始化数组dis[n]为maxint, dis[s]为0;
//以下操作循环执行至多n-1次,n为顶点数:
//	(1)对于每一条边e(u, v),如果dis[u] + w(u, v) < dis[v],则另dis[v] = dis[u]+w(u, v)。w(u, v)为边e(u,v)的权值;
//	(2)若上述操作没有对dis进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环。否则执行下次循环;
//	(3)为了检测图中是否存在负环路,即权值之和小于0的环路。对于每一条边e(u, v),如果存在dis[u] + w(u, v) < dis[v]的边,则图中存在负环路,即是说改图无法求出单源最短路径。否则数组dis[n]中记录的就是源点s到各顶点的最短路径长度。
const int maxn = 100;
const int maxint = 99999;

typedef struct Edge{
	int u,v; //起点,终点
	int weight;  //权重
}Edge;

Edge edge[maxn];	//保存边的值
int dis[maxn];	//源点到结点距离

int nodeNum,edgeNum,source;  //结点数,边数,源点

void Init(){
	scanf("%d %d %d",&nodeNum,&edgeNum,&source);
	for(int i = 1;i<= nodeNum;i++)
		dis[i] = maxint;
	dis[source] = 0;
	for(int i = 1;i<=edgeNum;i++){
		scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].weight);
		if(edge[i].u == source){
			dis[edge[i].v] = edge[i].weight;
		}
	}
}

void relax(int u,int v,int weight){
	if(dis[v] > dis[u] + weight)
		dis[v] = dis[u] + weight;
}

bool Bellman_Ford(){
	for(int i = 1;i<=nodeNum-1;i++)
		for(int j = 1;j<=edgeNum;j++)
			relax(edge[j].u,edge[j].v,edge[j].weight);
	bool flag = 1;
	for(int j = 1;j<=edgeNum;j++){
		if(dis[edge[j].v] > dis[edge[j].u] + edge[j].weight){
			flag = 0;
			break;
		}

	}
	return flag;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值