题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1874
题解:
纯Dijkstra算法题,但要注意S==T和无路的情况。
代码:
#include<stdio.h>
#define Max 100000000;
int N,M;
int map[210][210];
int mark[210];
int dij[210];
int S,T;
void init()
{
int i,j;
for(i=0;i<210;i++)
{
mark[i]=0;
for(j=0;j<210;j++)
{
map[i][j]=i==j?0:Max;
}
}
for(i=0;i<M;i++)
{
int a,b,t;
scanf("%d%d%d",&a,&b,&t);
if(map[a][b]>t) map[a][b]=map[b][a]=t;
}
scanf("%d%d",&S,&T);
}
int Dijkstra(int start,int end)
{
int i,j;
mark[start]=1;
for(i=0;i<N;i++)
{
dij[i]=map[start][i];
}
for(i=1;i<N;i++)
{
int min=Max;
int d=Max;
for(j=0;j<N;j++)
{
if(!mark[j]&&min>dij[j])
{
min=dij[j];
d=j;
}
}
if(d==100000000) return dij[end];
mark[d]=1;
for(j=0;j<N;j++)
{
if(!mark[j]&&dij[j]>dij[d]+map[d][j])
{
dij[j]=dij[d]+map[d][j];
}
}
}
return dij[end];
}
int main()
{
while(~scanf("%d%d",&N,&M))
{
init();
if(S==T)
{
printf("0\n");
continue;
}
int dis;
dis=Dijkstra(S,T);
if(dis==100000000) printf("-1\n");
else printf("%d\n",dis);
}
return 0;
}