这题以前做过,于是拿着HDUac的代码一交还WA了。。。
重写了一次
解法就是dijkstra算法
求单源最短路,人所在位置可以认为是0号城市,人附近的S个城市可以认为是从0号城市到达他所用的时间为0
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int street[1100][1100];//邻接矩阵
bool visited[1100];
int dist[1100];
int main()
{
int T,S,D;
while (~scanf("%d %d %d",&T,&S,&D))
{
memset(street,-1,sizeof(street));//-1就表示没有直接相连的道路
while (T--)
{
int a,b,time;
scanf("%d %d %d",&a,&b,&time);
if(street[a][b]==-1||time<street[a][b])
{
street[a][b]=time;
street[b][a]=time;
}
}
while (S--)
{
int a;
scanf("%d",&a);
street[0][a]=0;
street[a][0]=0;
}
memset(visited,false,sizeof(visited));
memset(dist,-1,sizeof(dist));
dist[0]=0;
while (true)
{
int mini=-1;
for(int i=0;i<1010;i++)
{
if(visited[i])
{
continue;
}
if(dist[i]==-1)
{
continue;
}
if(mini==-1||dist[mini]>dist[i])
{
mini=i;
}
}
if(mini==-1)
{
break;
}
visited[mini]=true;
for(int i=0;i<1010;i++)
{
if(street[mini][i]==-1)
{
continue;
}
if(dist[i]==-1||dist[mini]+street[mini][i]<dist[i])
{
dist[i]=dist[mini]+street[mini][i];
}
}
}
int ans=-1;
while(D--)
{
int a;
scanf("%d",&a);
if(ans==-1||ans>dist[a])
{
ans=dist[a];
}
}
printf("%d\n",ans);
}
return 0;
}