您的位置:首页 > 其它

最短路径之Dijkstra+Floyd算法

2011-04-29 09:44 381 查看
  从廉政师兄和志权师兄那里学会了最短路径的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

,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: