在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
输入保证至少存在1条商店到赛场的路线。
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
3 2
题意:求从某点(本题中标号1)到标号为n的点,所需要的最短距离
思路:因为权都是非负的,因此用迪杰斯特拉标号法,此题没有考虑重边问题,poj2378的代码考虑了重边,应以poj2378为模板
AC代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define INF 0x7fffffff
#define maxn 105
using namespace std;
int Map[maxn][maxn];
int vis[maxn];
int dis[maxn];
int n,m;
void Dijs()
{
int i,j;
memset(dis,INF,sizeof(dis));
dis[1]=0;
for(i=2;i<=n;++i){
dis[i]=Map[1][i];
}
memset(vis,0,sizeof(vis));
vis[1]=1;
int v,Min;
for(i=1;i<=n;++i){
Min=INF;
for(j=1;j<=n;++j){
if(!vis[j]&&dis[j]<Min){
v=j; //找出从前一点出发走最短路径能到达的点
Min=dis[j];
}
}
// printf("v=%d\t",v);
vis[v]=1;
for(j=1;j<=n;++j){
if(!vis[j]&&Map[v][j]<INF){
if(dis[j]>Map[v][j]+dis[v]){
dis[j]=Map[v][j]+dis[v]; //比较出从起点到达点j的最短路径
}
}
}
// printf("dis[%d]=%d\n",i,dis[i]);
}
printf("%d\n",dis[n]);
}
int main()
{
int a,b,c,i,j;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0)break;
for(i=0;i<=n;++i){
for(j=0;j<=n;++j){
Map[i][j]=INF;
}
}
for(i=1;i<=m;++i){
scanf("%d%d%d",&a,&b,&c);
Map[a][b]=c;
Map[b][a]=c;
}
Dijs();
}
return 0;
}
戳链接看大神:
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html