2544 最短路 Dijkstra算法 Floyd算法 Bellman_Ford算法 SPFA算法
2010-11-18 21:53
447 查看
Dijkstra算法 Floyd_warshall算法 Bellman_Ford算法
源 单源 多源 单源
时间复杂度 n2(n个点) n3 VE
负权值 No Yes Yes
Dijkstra算法
6 7
1 2 5
1 3 6
2 4 7
3 5 2
2 5 1
4 6 4
5 6 3
等于9 1->2->5->6
Floyd_warshall算法
Bellman_Ford算法
http://hi.baidu.com/%B0%AE%D0%C4%CD%AC%C3%CB_%B3%C2%F6%CE/blog/item/0302d1d8db40b43d33fa1ceb.html
http://www.nocow.cn/index.php/Bellman-Ford%E7%AE%97%E6%B3%95
SPFA算法 就是Bellman_Ford做成优先队列
优先队列 0MS
stl queue 15MS
SPFA+DFS 15MS
源 单源 多源 单源
时间复杂度 n2(n个点) n3 VE
负权值 No Yes Yes
Dijkstra算法
#include <stdio.h> #define N 101 #define MAX 0x7ffffff//不要设成最大值 否者会加出负数 int n; int mark ; int map ; int path ;//存放1到n的最短路 void dij(int v) { int min,i,j,k,dis; for (i=1;i<=n;i++) { path[i]=map[v][i]; mark[i]=0; } mark[1]=1; for (i=2;i<=n;i++) { min=MAX; k=v; for (j=2;j<=n;j++) { if (!mark[j] && path[j]<min)//在未mark点中,找到1点到此点路径最短的那个点k { min=path[j]; k=j; } } mark[k]=1; for (j=2;j<=n;j++) { dis=map[k][j]+path[k];//加进k点后修改最短路径 if (!mark[j] && dis<path[j] ) { path[j]=dis; } } } } int main () { //freopen("1.txt","r",stdin); int i,j,u,v,cost,m; while(scanf("%d%d",&n,&m),n||m) { for (i=1;i<=n;i++)//初始化 { for (j=1;j<=n;j++) map[i][j]=MAX; } for (i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&cost); map[u][v]=map[v][u]=cost; } dij(1); printf("%d/n",path ); } }
6 7
1 2 5
1 3 6
2 4 7
3 5 2
2 5 1
4 6 4
5 6 3
等于9 1->2->5->6
Floyd_warshall算法
#include <stdio.h> #define N 101 #define INF 0x7ffffff int n; int map ; int min(int a,int b) { return a<b? a:b; } void floyd()//folyd算法 { int i,j,k; for (k=1;k<=n;k++) { for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { map[i][j]=min(map[i][j],map[i][k]+map[k][j]); } } } } int main () { //freopen("1.txt","r",stdin); int i,j,u,v,cost,m; while(scanf("%d%d",&n,&m),n||m) { for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { map[i][j]=INF; } } while(m--) { scanf("%d%d%d",&u,&v,&cost); map[u][v]=map[v][u]=cost; } floyd(); printf("%d/n",map[1] ); } }
Bellman_Ford算法
http://hi.baidu.com/%B0%AE%D0%C4%CD%AC%C3%CB_%B3%C2%F6%CE/blog/item/0302d1d8db40b43d33fa1ceb.html
http://www.nocow.cn/index.php/Bellman-Ford%E7%AE%97%E6%B3%95
#include <stdio.h> #define N 10005 struct { int s,e,w;//start end weight }t ; int d[101]; void Bellman_Ford(int n,int m) { int i,j; d[1]=0;//起点初始化为0 其他的的全部初始化为infinity for (i=2;i<=n;i++) d[i]=0x7ffffff; for (i=1;i<n;i++)//迭代n-1次 { for (j=0;j<m;j++)//m条边 { if (d[t[j].s]+t[j].w<d[t[j].e]) d[t[j].e]=d[t[j].s]+t[j].w; if (d[t[j].e]+t[j].w<d[t[j].s]) d[t[j].s]=d[t[j].e]+t[j].w;//双向 } } } int main () { //freopen("2544.txt","r",stdin); int n,m,i; while(scanf("%d%d",&n,&m),n||m) { for (i=0;i<m;i++) scanf("%d%d%d",&t[i].s,&t[i].e,&t[i].w); Bellman_Ford(n,m); printf("%d/n",d ); } }
SPFA算法 就是Bellman_Ford做成优先队列
优先队列 0MS
stl queue 15MS
SPFA+DFS 15MS
#include<stdio.h> #include<string.h> #include <map> #include <queue> #define _clr(a) memset(a,0,sizeof(a)) using namespace std; #define N 101 int d ; int n,m; map<int,int> head ;// head[u][v]=w void spfa(int st) //start { int i; int u,v,w; map<int,int>::iterator it; queue<int> q; //起点初始化为0 其他的的全部初始化为infinity for (i=1;i<=n;i++) d[i]=0x7ffffff; d[st]=0; q.push(st); while(!q.empty()) { u=q.front(); q.pop(); for (it=head[u].begin();it!=head[u].end();it++) { v=it->first; w=it->second; if (d[u]+w<d[v]) { d[v]=d[u]+w; q.push(v); } } } } int main() { //freopen("2544.txt","r",stdin); map<int,int>::iterator it; int i; int u,v,w; int cnt ; while(scanf("%d%d",&n,&m),n||m) { _clr(cnt); for (i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); head[u][v]=head[v][u]=w; } spfa(1); for (i=0;i<n;i++) head[i].clear(); printf("%d/n",d ); } }
相关文章推荐
- 最短路算法 :Bellman-ford算法 & Dijkstra算法 & floyd算法 & SPFA算法 详解
- 最短路算法(Floyd算法,Dijkstra算法,Bellman-Ford算法,SPFA算法)
- 最短路算法 :Bellman-ford算法 & Dijkstra算法 & floyd算法 & SPFA算法 详解
- 最短路算法 :Bellman-ford算法 & Dijkstra算法 & floyd算法 & SPFA算法 详解
- [算法与数据结构] - No.10 图论(3)- 最短路Dijkstra算法、Bellman-Ford算法和Floyd算法
- HDU 2544-最短路(Dijkstra算法 Floyd算法 SPFA算法,3种实现代码,包含路径)
- 单源最短路径——Dijkstra算法,Bellman-Ford算法,SPFA算法
- 六度分离(floyd算法,SPFA算法,最短路—Dijkstra算法)
- 图之单源最短路径 Bellman-Ford算法 Dijkstra算法 SPFA算法
- 【最短路径】:Dijkstra算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法
- 最短路之Dijkstra算法、Floyd算法、SPFA算法
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
- HDU 2544 最短路 Dijkstra 算法、 Floyd 算法 Bellman_ford算法
- POJ - 2240 Arbitrage (最短路 Floyd算法 && Bellman-Ford算法)
- 最短路径(Floyd算法和Dijkstra算法和Bellman-Ford算法)
- Dijkstra算法、Bellman-Ford算法、Floyd算法
- hdu 2544 最短路 (Bellman_Ford算法)
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
- 最短路径(Floyd算法和Dijkstra算法和Bellman-Ford算法)
- 六度分离(floyd算法,SPFA算法,最短路—Dijkstra算法)