题意:一个人想去看他的朋友 , 他自己可以从N个位置出发。
思路:这是一个多源单汇的最短路问题。
因为我还不会用FLOYD算法。。 所以只能用麻烦的dij算法了。
把多源单汇问题转化为单源多汇问题。 用dij搜一遍以终点为起点的最短路。
然后从多个起点的最短路中找出一个最短的。
如果没有就输出-1
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define INF 10000000
using namespace std;
int a[1000][1000];
int u[1005];
int d[1005];
int kk[1005];
int N;
void dij(int s)
{
memset(u,0,sizeof(u));
d[s]=0;
while(1)
{
int v=-1;
for(int i=1;i<=N;i++)
{
if(u[i]==0&&(v==-1||d[i]<d[v]))
v=i;
}
if(v==-1) break;
u[v]=1;
for(int i=1;i<=N;i++)
{
d[i]=min(d[i],d[v]+a[v][i]);
}
}
}
int main()
{
int M,S;
while(scanf("%d%d%d",&N,&M,&S)!=EOF)
{ for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
a[i][j]=INF;
for(int i=1;i<=N;i++)
d[i]=INF;
while(M--)
{
int q,p,l;
scanf("%d%d%d",&q,&p,&l);
a[p][q]=min(a[p][q],l);
}
int K;
scanf("%d",&K);
for(int i=0;i<K;i++)
scanf("%d",&kk[i]);
dij(S);
int mm=INF;
for(int i=0;i<K;i++)
{
if(d[kk[i]]<mm)
mm=d[kk[i]];
}
if(mm==INF)
printf("-1\n");
else printf("%d\n",mm);
}
}