最短路径之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;

}



你可能感兴趣的:(dijkstra)