最短路径之Dijkstra+Floyd算法
2011-04-29 09:44
381 查看
从廉政师兄和志权师兄那里学会了最短路径的Dijkstra,Floyd,Bellman-Ford算法和最大匹配算法。思考完模板后,终于找了一道水题POJ1502先来练练Dijkstra算法。
Dijkstra给我的第一感觉跟Prim有点相似。只是更新权值的方式不同,因为要求的是最短路径,所以每个点的消耗都是累计之前相连的点的消耗。以下是小弟POJ1502的代码:
至于Floyd算法求没两个点之间的距离,代码很简单,三个循环就搞定了。水了一题POJ1125,代码如下:
Dijkstra给我的第一感觉跟Prim有点相似。只是更新权值的方式不同,因为要求的是最短路径,所以每个点的消耗都是累计之前相连的点的消耗。以下是小弟POJ1502的代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 120 #define MaxInt 0x3f3f3f3f int n,m; int map ,visited ,low ; void Dijkstra() { int pos=1,i,j,min; memset(visited,0,sizeof(visited)); for(i=1;i<=n;i++) low[i]=map[pos][i]; visited[1]=1; for(i=1;i<n;i++) { min=MaxInt; for(j=1;j<=n;j++) if(visited[j]==0&&min>low[j]) { min=low[j];pos=j; } visited[pos]=1; for(j=1;j<=n;j++) if(visited[j]==0&&low[j]>low[pos]+map[pos][j]) low[j]=low[pos]+map[pos][j]; } printf("%d\n",low[pos]); } int main() { int i,j; char v[50]; while(scanf("%d",&n)!=EOF) { memset(map,MaxInt,sizeof(map)); for(i=1;i<=n;i++) map[i][i]=0; m=n*(n-1)/2; for(i=2;i<=n;i++) for(j=1;j<i;j++) { scanf("%s",&v); if(strcmp(v,"x")!=0) map[i][j]=map[j][i]=atoi(v); } Dijkstra(); } return 0; }
至于Floyd算法求没两个点之间的距离,代码很简单,三个循环就搞定了。水了一题POJ1125,代码如下:
#include <stdio.h> #include <string.h> #define N 150 #define MaxInt 0x3f3f3f3f int n,m; int map ; void Floyd() { int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(map[i][k]+map[k][j]<map[i][j]) map[i][j]=map[i][k]+map[k][j]; } int main() { int i,j,t,pos,min,max; while(scanf("%d",&n)!=EOF&&n!=0) { memset(map,MaxInt,sizeof(map)); for(i=1;i<=n;i++) map[i][i]=0; for(i=1;i<=n;i++) { scanf("%d",&t); while(t--) { scanf("%d",&j); scanf("%d",&map[i][j]); } } Floyd(); min=MaxInt; for(i=1;i<=n;i++) { max=0; for(j=1;j<=n;j++) if(max<map[i][j]) max=map[i][j]; if(min>max) { min=max; pos=i; } } printf("%d %d\n",pos,min); } return 0; }
相关文章推荐
- 最短路径之Dijkstra+Floyd算法
- 最短路径算法正确性和操作性闲杂谈-Dijkstra&Floyd算法
- Dijkstra和Floyd算法----最短路径算法
- 最短路径:Dijkstra,Bellman,SPFA,Floyd算法的实现
- 图的最短路径:Dijkstra、Bellman-Ford、Floyd算法
- 最短带权路径问题Dijkstra和Floyd算法
- ZOJ 1221 Risk(最短路径Dijkstra和Floyd算法)
- Dijkstra [迪杰斯特拉]算法思路(求单点到其他每个点的各个最短路径)Floyd算法:任意两点间最短距离
- Dijkstra最短路径算法详解
- 多源最短路径之Floyd算法
- [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]
- 最短路径Floyd算法(C语言)
- Dijkstra模板求单源点最短路径
- 最短路径算法----Dijkstra (转)
- 单源最短路径问题[Dijkstra实现]
- HDOJ 3790 最短路径问题 (最短路 && Dijkstra && 双权值)
- dijkstra 最短路径算法模板
- 最短路径_Dijkstra
- 最短路径—Dijkstra算法和Floyd算法
- Java邻接表表示加权有向图,附dijkstra最短路径算法