题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
题目大意: 求从商场到赛场的最短时间。
思路:即求最短路径问题。
分别用三种解决最短路径代码如下:
方法一:Dijkstar求最短路径
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<iostream>
#include<math.h>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m;
const int MAXN=310;
int map[MAXN][MAXN],vis[MAXN],low[MAXN];
int Dijkstar()
{
int pos,i,j,min;
memset(vis,0,sizeof(vis));
pos=1;
vis[1]=1;
for(i=1; i<=n; i++)
{
if(i!=pos)
{
low[i]= map[pos][i];
}
}
low[1]=0;
for(i=1; i<=n; i++)
{
min=INF;
for(j=1; j<=n; j++)
{
if(vis[j]==0&&min>low[j])
{
min=low[j];
pos=j;
}
}
if(min==INF)
{
break;
}
vis[pos]=1;
for(j=1; j<=n; j++)
{
if(vis[j]==0&&low[j]>low[pos]+map[pos][j])
{
low[j]=low[pos]+map[pos][j];
}
}
}
return low[n];
}
int main()
{
while(~scanf("%d%d",&n,&m)&&(n+m))
{
int a,b,c;
//memset(map,INF,sizeof(map));
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
map[i][j]=INF;
}
}
for(int i=1; i<=m; i++)
{
cin>>a>>b>>c;
if(c<map[a][b])
{
map[a][b]=map[b][a]=c;
}
}
int answer=Dijkstar();
printf("%d\n",answer);
}
return 0;
}
方法二:用floyd求最短路径
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<iostream>
#include<math.h>
using namespace std;
const int maxn=205;
const int inf=0x3f3f3f3f;
int map[maxn][maxn];
void floyd(int n)
{
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{
map[j][k]=min(map[j][k],map[j][i]+map[i][k]);
}
}
}
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
{
break;
}
int a,b,c;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(i==j)
{
map[i][j]==0;
}
else
{
map[i][j]=map[j][i]=inf;
}
}
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
floyd(n);
printf("%d\n",map[1][n]);
}
return 0;
}
方法三:用spfa求最短路径
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<climits>
#include<queue>
#include<algorithm>
using namespace std;
#define N 110
#define MAX INT_MAX >> 1
#define CLR(arr, what) memset(arr, what, sizeof(arr))
int nodenum, edgenum;
int map[N][N], dis[N];
bool vis[N];
int i,j;
int n,m;
int spfa(int start,int endd)
{
queue<int>q;
memset(vis,0,sizeof(vis));
for(i=1; i<=n; i++)
{
dis[i]=MAX;
}
dis[start]=0;
vis[start]=1;
q.push(start);
while(!q.empty())
{
int cur=q.front();
q.pop();
vis[cur]=0;
for(i=1; i<=n; i++)
{
if(dis[i]>dis[cur]+map[cur][i])
{
dis[i]=dis[cur]+map[cur][i];
if(vis[i]==0)
{
q.push(i);
vis[i]=1;
}
}
}
}
return dis[endd];
}
int main()
{
int start,end,cost;
int answer;
while(~scanf("%d%d",&n,&m)&&(n+m))
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
map[i][j]=MAX;
}
}
for(i=1; i<=m; i++)
{
cin>>start>>end>>cost;
if(cost<map[start][end])
{
map[start][end]=map[end][start]=cost;
}
}
answer=spfa(1,n);
printf("%d\n",answer);
}
}