最短路径之Dijkstra+Floyd算法
从廉政师兄和志权师兄那里学会了最短路径的Dijkstra,Floyd,Bellman-Ford算法和最大匹配算法。思考完模板后,终于找了一道水题POJ1502先来练练Dijkstra算法。
Dijkstra给我的第一感觉跟Prim有点相似。只是更新权值的方式不同,因为要求的是最短路径,所以每个点的消耗都是累计之前相连的点的消耗。以下是小弟POJ1502的代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 120 #define MaxInt 0x3f3f3f3f int n,m; int map[N][N],visited[N],low[N]; 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[N][N]; 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; }