/*这个题目没什么好说的
但因为RE了将近2个小时
不纪念对不起自己
记住,秒杀才是王道
拖得越久越不利
*/
#include<stdio.h>
#include<string.h>
#define max_n 160
#define inf 1234567
int vis[max_n];
long dist[max_n];
int map[max_n][max_n];
char name[max_n][40];
int n,m;
void dij(int v)
{
int i,j,max,f;
memset(vis,0,sizeof(vis));
for(i=1;i<=m;i++)
dist[i]=map[v][i];
dist[v]=0;
vis[v]=1;
for(i=1;i<=m;i++)
{
max=inf,f=0;
for(j=1;j<=m;j++)
if(!vis[j] &&max>dist[j])
{
max=dist[j];
f=j;
}
if(f==0)
break;
vis[f]=1;
for(j=1;j<=m;j++)
if(!vis[j]&&dist[j]>dist[f]+map[f][j])
dist[j]=dist[f]+map[f][j];
}
}
int find(char str[32])
{
int i;
for(i=1;i<=m;i++)
if(strcmp(name[i],str)==0)
return i;
if(m==0||i>m)
{
m++;
strcpy(name[m],str);
return m;
}
}//此函数是个小技巧,参考了别人的代码。
int main()
{
int s,e,a,b,c,i,j;
char start[40],end[40],s1[40],s2[40];
while(scanf("%d",&n)!=EOF)
{
if(n==-1)
break;
m=0;
scanf("%s%s",start,end);
for(i=0;i<max_n;i++)
for(j=0;j<max_n;j++)
map[i][j]=inf;
for(i=0;i<n;i++)
{
scanf("%s%s%d",s1,s2,&c);
a=find(s1);
b=find(s2);
if(map[a][b]>c) map[a][b]=map[b][a]=c;
}
s=find(start);
e=find(end);
if(s==e)
printf("0\n");
else
{
dij(s);
if(dist[e]==inf)
printf("-1\n");
else
printf("%ld\n",dist[e]);
}
}
return 0;
}
最短路裸题hdu-2112-DIJ
最新推荐文章于 2020-01-28 06:28:26 发布