原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
分析:很直白的求最短路径问题,这里用SPFA算法解。注意题目的这句话“每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择”,即在输入时有 1到5用时9 ,1到5用时15等数据。所以每次输入的时候要判断。
我的代码:
#include<stdio.h>
#include<queue>
using namespace std;
#define INF 0xffffff
int map[220][220];
int dis[220];
void init(int n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) map[i][j]=INF;
}
void SPFA(int n,int s)
{
int visited[220]={0}; //标记是否在队列里。
for(int i=0;i<n;i++) dis[i]=INF;
queue<int> Q;
Q.push(s);
visited[s]=1;
dis[s]=0;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
visited[u]=0;
for(int i=0;i<n;i++)
{
if(map[u][i]!=INF&&dis[i]>dis[u]+map[u][i])
{
dis[i]=dis[u]+map[u][i];
if(!visited[i]) //在队列里就不用进队列了。
{
Q.push(i);
visited[i]=1;
}
}
}
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
init(n);
for(int i=0;i<m;i++)
{
int a,b,l;
scanf("%d %d %d",&a,&b,&l);
if(map[a][b]>l) //注意这里,在输入时保存最少的时间。
map[a][b]=map[b][a]=l;
}
int s,e;
scanf("%d%d",&s,&e);
SPFA(n,s);
if(dis[e]!=INF)
{
printf("%d\n",dis[e]);
}
else
printf("-1\n");
}
return 0;
}
总结:就是输入的时候没有处理,搞了好久QAQ.