题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2112
题解:
这题难点在把字符转换成数字,然后纯Dijkstra算法。
把字符转换成数字代码:
int find(char str[40])
{
int i;
for(i=1;i<=N;i++)
{
if(strcmp(name[i],str)==0)
return i;
}
if(N==0||i>N)
{
N++;
strcpy(name[N],str);
return N;
}
}
N为公交站数,先初始化为0。
代码:
#include<stdio.h>
#include<string.h>
const int Max=100000000;
int map[160][160];
int mark[160];
char name[160][32];
int N,M;
int S,T;
int dij[160];
int find(char str[40])
{
int i;
for(i=1;i<=N;i++)
{
if(strcmp(name[i],str)==0)
return i;
}
if(N==0||i>N)
{
N++;
strcpy(name[N],str);
return N;
}
}
void init()
{
N=0;
char s1[40],s2[40],start[40],end[40];
int i,j;
for(i=1;i<160;i++)
{
mark[i]=0;
for(j=1;j<160;j++)
{
map[i][j]=i==j?0:Max;
}
}
scanf("%s%s",start,end);
S=find(start);
T=find(end);
int time;
int ss1,ss2;
for(i=1;i<=M;i++)
{
scanf("%s %s %d",s1,s2,&time);
ss1=find(s1);
ss2=find(s2);
if(time<map[ss1][ss2])
map[ss1][ss2]=map[ss2][ss1]=time;
}
}
int dijkstra(int T)
{
int i,j;
mark[S]=1;
for(i=1;i<=N;i++)
{
dij[i]=map[S][i];
}
for(i=1;i<N;i++)
{
int min,d;
min=Max;
d=Max;
for(j=1;j<=N;j++)
{
if(!mark[j]&&dij[j]<min)
{
min=dij[j];
d=j;
}
}
if(d==Max)
return d;
mark[d]=1;
for(j=1;j<=N;j++)
{
if(!mark[j]&&dij[j]>dij[d]+map[d][j])
{
dij[j]=dij[d]+map[d][j];
}
}
}
return dij[T];
}
int main()
{
while(scanf("%d",&M),M!=-1)
{
init();
if(S==T)
{
printf("0\n");
continue;
}
int dis;
dis=dijkstra(T);
if(dis==100000000)
printf("-1\n");
else
printf("%d\n",dis);
}
return 0;
}