题目意思
给你三个数N,M,S分别代表N个车站,M条路和终点S。然后给你一个W,接着W个数表示出发点,现在要求的是从起点开始到终点的最短距离。
解题思路
这道题和之前的那道一个人的旅行那道题很像,我们将起点统一看成0,然后只要将那W个出发点到0的距离定为0,那么这道题就转化成立一道普通的最短路问题,就用dijkstra写就好。
代码部分
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
int maps[1005][1005];
int dis[1005];
int vis[1005];
int n,m,s;
void dijkstra(int u,int v)
{
int pos=u;
memset(vis,0,sizeof(vis));
for(int i=0; i<=n; i++)
dis[i]=maps[u][i];
vis[u]=1;
for(int i=0; i<=n; i++)
{
int minn=INF;
for(int j=0; j<=n; j++)
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
pos=j;
}
}
vis[pos]=1;
for(int j=0; j<=n; j++)
{
if(!vis[j]&&dis[j]>maps[pos][j]+dis[pos])
dis[j]=maps[pos][j]+dis[pos];
}
}
}
int main()
{
int p,q,t,w,a;
while(~scanf("%d%d%d",&n,&m,&s))
{
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
maps[i][j]=INF;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&p,&q,&t);
if(maps[p][q]>t)
maps[p][q]=t;
}
scanf("%d",&w);
for(int i=0; i<w; i++)
{
scanf("%d",&a);
maps[0][a]=0;
}
dijkstra(0,s);
printf("%d\n",dis[s]==INF?-1:dis[s]);
}
return 0;
}