杭电 2544 最短路(Floyd、Dijkstra入门)

目录

一、Floyd算法

二、dijkstra算法

 


传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2544

一、Floyd算法

算法复杂度 o(n³)

算法思路:从a到b的路线,引入中间点c,如果走a->c->b比a->b快,那么将maze[a][b]置为maze[a][c]+maze[c][b]。最终

                  maze[x][y]就是从x到y的最短路。

AC代码:

#include<iostream>
#include<algorithm>
using namespace std;
int maze[101][101];
int n;
#define maxn 0x3f3f3f3f
void Floyd()
{
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(maze[i][k]<maxn&&maze[k][j]<maxn)
					maze[i][j]=min(maze[i][j],maze[i][k]+maze[k][j]);
			}
		}
	}
}
int main()
{
	int m;
	while(cin>>n>>m&&n)
	{
		for(int i=1;i<=n;i++)
			for(int j=1;j<=i;j++)  
				maze[i][j]=maze[j][i]=maxn;
		while(m--)
		{
			int a,b,c;
			cin>>a>>b>>c;
			maze[a][b]=maze[b][a]=c;
		}
		Floyd();
		cout<<maze[1][n]<<endl;
	}
	return 0;
} 

二、dijkstra算法

算法复杂度o(n²)

算法思路:将所有点分为S T两集合,每次在T中找距离S最短的点放入S中。代码中用vis数组界定S T

AC代码:

#include<cstring> 
#include<iostream>
#include<algorithm>
using namespace std;
int maze[101][101];
int vis[101];
int d[101];//源点到各个点的最短距离
int n;
#define INF 0x3f3f3f3f
void Dijkstra(int s)
{
	d[s]=0;//源点到源点距离为0 
	for(int i=1;i<=n;i++)
	{
		int u=-1;
		for(int j=1;j<=n;j++)
			if(!vis[j])
			{
				if(u==-1||d[u]>d[j]) u=j;//找剩余点中最短路 
			}
		vis[u]=1;
		for(int j=1; j<=n; ++j)	
		{
        	if(!vis[j])	d[j]=min(d[j],d[u]+maze[u][j]);
       	}
       	//用d[x]记录从源点到x的最短距离 
	}
}
int main()
{
	int m;
	while(cin>>n>>m&&n)
	{
		memset(maze,INF,sizeof(maze));
		memset(vis,0,sizeof(vis));
		memset(d,INF,sizeof(d));
		while(m--)
		{
			int a,b,c;
			cin>>a>>b>>c;
			maze[a][b]=maze[b][a]=c;
		}
		Dijkstra(1);
		cout<<d[n]<<endl;
	} 
	return 0;
}

 

猜你喜欢

转载自blog.csdn.net/jack_jxnu/article/details/81448594