Bellman-Ford算法
#include<stdio.h>
#define max 0xffffff
int g[][]; //图的邻接矩阵
int dist[];
int n;//顶点个数
int m;//边个数
struct Edge
{
int u, v, w; //边:起点、终点、权值
};
Edge e[];
bool bellman_ford(int n)//bellman-ford算法
{
int i, k, t,j;
for(i=;i<n;i++)
dist[i]=g[][i];//初始化
for(i=;i<=n-;i++)
{ /*假设第k条边的起点是u,终点是v,以下循环考虑第k条边是否会使得源点v0到v的
最短距离缩短,即判断dist[edges[k].u] + edges[k].w < dist[edges[k].v] 是否成立*/
for(j=;j<n;j++)
{
printf("%d ",dist[j]);
}
printf("\n");
for(k=;k<=m;k++)
{
t=dist[e[k].u]+e[k].w;
if(dist[e[k].u]<max&&t<dist[e[k].v])
{
dist[e[k].v] = t;
}
}
}
/*以下是检查,若还有更新则说明存在无限循环的负值回路*/
for(k = ; k < m; k ++)
{
if(dist[e[k].u] != max &&dist[e[k].u] + e[k].w < dist[e[k].v])
{
return false;
}
}
return true;
} int main()
{
scanf("%d %d",&n,&m);
int i,j;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
g[i][j]=max;
g[i][i]=;
}
for(i=;i<=m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
e[i].u=a;
e[i].v=b;
e[i].w=c;
g[a][b]=c;
}
for(i=;i<n;i++)
{
for(j=;j<n;j++)
printf("%d ",g[i][j]);
printf("\n");
}
bellman_ford(n);
for(i=;i<n;i++)
{
printf("%d\n",dist[i]);
} return ;
} /* 7 10
0 1 6
0 2 5
0 3 5
1 4 -1
2 1 -2
2 4 1
3 2 -2
3 5 -1
4 6 3
5 6 3 Press any key to continue */
……
递推公式(求顶点u到源点v的最短路径):
dist 1 [u] = Edge[v][u]
dist k [u] = min{ dist k-1 [u], min{ dist k-1 [j] + Edge[j][u] } }, j=0,1,…,n-1,j≠u
struct Edge
{
int u, v, w; //边:起点、终点、权值
};
Edge e[];
void bellman_ford(int n)//bellman-ford算法
{
int i, k, t;
for(i=;i<=n;i++)
dist[i]=g[][i];//初始化
for(i=;i<=n;i++)
{
for(k=;k<=m;k++)
{
t=dist[e[k].u]+e[k].w;
if(dist[e[k].u]<max&&t<dist[e[k].v])
{
dist[e[k].v] = t;
}
}
}
}

#include<stdio.h>
#define max 0xffffff
int g[][]; //图的邻接矩阵
int dist[];
int n;//顶点个数
int m;//边个数
struct Edge
{
int u, v, w; //边:起点、终点、权值
};
Edge e[];
bool bellman_ford(int n)//bellman-ford算法
{
int i, k, t,j;
for(i=;i<n;i++)
dist[i]=g[][i];//初始化
for(i=;i<=n-;i++)
{ /*假设第k条边的起点是u,终点是v,以下循环考虑第k条边是否会使得源点v0到v的
最短距离缩短,即判断dist[edges[k].u] + edges[k].w < dist[edges[k].v] 是否成立*/
for(j=;j<n;j++)
{
printf("%d ",dist[j]);
}
printf("\n");
for(k=;k<=m;k++)
{
t=dist[e[k].u]+e[k].w;
if(dist[e[k].u]<max&&t<dist[e[k].v])
{
dist[e[k].v] = t;
}
}
}
/*以下是检查,若还有更新则说明存在无限循环的负值回路*/
for(k = ; k < m; k ++)
{
if(dist[e[k].u] != max &&dist[e[k].u] + e[k].w < dist[e[k].v])
{
return false;
}
}
return true;
} int main()
{
scanf("%d %d",&n,&m);
int i,j;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
g[i][j]=max;
g[i][i]=;
}
for(i=;i<=m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
e[i].u=a;
e[i].v=b;
e[i].w=c;
g[a][b]=c;
}
for(i=;i<n;i++)
{
for(j=;j<n;j++)
printf("%d ",g[i][j]);
printf("\n");
}
bellman_ford(n);
for(i=;i<n;i++)
{
printf("%d\n",dist[i]);
} return ;
} /* 7 10
0 1 6
0 2 5
0 3 5
1 4 -1
2 1 -2
2 4 1
3 2 -2
3 5 -1
4 6 3
5 6 3 Press any key to continue */
void bellman_ford(int n)//bellman-ford算法
{
int i, k, t,j;
for(i=;i<=n;i++)
dist[i]=g[][i];//初始化
for(k=;k<=n;k++)
{
for(j=;j<=n;j++)
{
for(i=;i<=n;i++)
{
if(g[i][j]<max&&dist[i]+g[i][j]<dist[j])
dist[j]=dist[i]+g[i][j];
}
}
}
}
Bellman-Ford算法的更多相关文章
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】
题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
- 图论算法——最短路径Dijkstra,Floyd,Bellman Ford
算法名称 适用范围 算法过程 Dijkstra 无负权 从s开始,选择尚未完成的点中,distance最小的点,对其所有边进行松弛:直到所有结点都已完成 Bellman-Ford 可用有负权 依次对所 ...
- POJ 2240 Arbitrage (Bellman Ford判正环)
Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions:27167 Accepted: 11440 Descri ...
- poj1860 兑换货币(bellman ford判断正环)
传送门:点击打开链接 题目大意:一个城市有n种货币,m个货币交换点,你有v的钱,每个交换点只能交换两种货币,(A换B或者B换A),每一次交换都有独特的汇率和手续费,问你存不存在一种换法使原来的钱更多. ...
- ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))
这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间. ZOJ1791(POJ1613)-Cave Raider //限制行走时间的最短路 //POJ1613-ZOJ1791 //Time ...
随机推荐
- am,pm时间转换
写在前面 最近遇到的一个问题,在英文操作系统上,获取到的时间是带am或者pm的.但是数据库是datetime类型,存储的时候竟然都变成0000-00-00 00:00:00.但是在中文操作系统上又是正 ...
- DOM(十)使用DOM设置单选按钮、复选框、下拉菜单
1.设置单选按钮 单选按钮在表单中即<input type="radio" />它是一组供用户选择的对象,但每次只能选一个.每一个都有checked属性,当一项选择为t ...
- git for windows 入门随笔
引言: Git 是当前最流行的集中化的版本控制程序之一(版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统),Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件 ...
- ASP.NET Web API实现POST报文的构造与推送
毕设和OAuth协议相关,而要理解OAuth协议就必须理解HTTP GET/POST方法.因此研究了一下如何使用Web API或MVC构造POST报文并实现客户端与服务器端的交互. 我使用的工具是Vi ...
- 虚拟机去混杂模式与 vlan in vxlan 特性
1. 去混杂模式 1.1 背景 混杂模式(Promiscuous Mode)是指一台机器能够接收所有经过它的数据流,而不论其目的地址是否是它.是相对于通常模式(又称“非混杂模式”)而言的. 这被网络管 ...
- Quartz 定时任务管理
前言 将项目中的所有定时任务都统一管理吧,使用 quartz 定时任务 设计思路 使用 quartz 的相关jar 包,懒得去升级了,我使用的是 quart 1.6 写一个定时任务管理类 用一张数据库 ...
- Java异常-一般异常和运行时异常的区别
Java提供了两类主要的异常:runtime exception和checked exception.checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常.对于这种异常, JA ...
- 解决vs2015使用fopen、fprintf等函数报错的问题
出现错误提示: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable ...
- ARP协议格式、ARP运行机制入门学习
相关学习资料 http://baike.baidu.com/view/149421.htm?fromtitle=ARP%E5%8D%8F%E8%AE%AE&fromid=1742212& ...
- MVC区域 视图必须派生自 WebViewPage 或 WebViewPage<TModel>
http://blog.csdn.net/iack_ji/article/details/16965885 今天在学习 mvc区域时,将区域控制器类 外迁到其他的程序集的练习中出现了"视图必 ...