题目意思
给你T条路,现在小草要从S个与他相邻的城市出发,去D个目的地中的一个,要你求到达目的地的最短时间。
解题思路
这就一道用dijkstra的最短路的题。这道题中的坑点就是小草到他相邻的城市的距离是0。用dijkstra跑一遍就出答案啦!
代码部分
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
using namespace std;
const int INF=99999;
int map[1010][1010];
int dis[1010];///存储最短路
int vis[1010];///标记数组
int nex[1010];///记录与他相邻的城市
int ed[1010];///记录目的地
int t,s,d,n;
int dijkstra()
{
int pos;
memset(vis,0,sizeof(vis));
for(int i=0; i<=n; i++)
dis[i]=map[0][i];
vis[0]=1;
for(int i=1; i<=n; i++)
{
int min=INF;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&min>dis[j])
{
min=dis[j];
pos=j;
}
}
vis[pos]=1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>map[pos][j]+dis[pos])
dis[j]=map[pos][j]+dis[pos];
}
}
}
int main()
{
int a,b,tim,ans;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
n=0;
for(int i=0; i<1010; i++)
for(int j=0; j<1010; j++)
{
map[i][j]=INF;
map[i][i]=0;
}
while(t--)
{
scanf("%d%d%d",&a,&b,&tim);
n=max(max(n,a),b);
if(map[a][b]>tim)
map[a][b]=map[b][a]=tim;
}
ans=INF;
for(int i=0; i<s; i++)
{
scanf("%d",&nex[i]);
map[0][nex[i]]=map[nex[i]][0]=0;
}
for(int i=0; i<d; i++)
{
scanf("%d",&ed[i]);
}
dijkstra();
for(int i=0; i<d; i++)
{
ans=min(ans,dis[ed[i]]);
}
printf("%d\n",ans);
}
return 0;
}