目录
传送门: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;
}