最短路问题。果然好久不做都忘得差点儿相同了,跑一次Dijkstra算法把全部点的最短距离都跑出来
#include<iostream> #include<cstring> #define maxn 1005 #define inf 1<<30 using namespace std; int t,s,d; int mapp[maxn][maxn]; int w[maxn]; int visit[maxn]; int di[maxn]; void solve() { memset(visit,0,sizeof(visit)); fill(di,di+maxn,inf); di[0]=0; while(t--) { int v=-1; for(int i=0;i<maxn;i++) { if(!visit[i]&&(v==-1||di[i]<di[v])) v=i; } //cout<<s<<"~"<<v<<endl; visit[v]=1; for(int i=0;i<maxn;i++) { if(mapp[v][i]!=inf) { di[i]=min(di[i],di[v]+mapp[v][i]); //cout<<i<<"~"<<di[i]<<endl; } } } } int main() { while(cin>>t>>s>>d) { for(int i=0;i<maxn;i++) { for(int j=0;j<maxn;j++) mapp[i][j]=inf; } for(int i=0;i<t;i++) { int x,y,z; cin>>x>>y>>z; mapp[y][x]=mapp[x][y]=min(z,mapp[x][y]); } for(int i=0;i<s;i++) { int x; cin>>x; mapp[0][x]=mapp[x][0]=0; } for(int i=0;i<d;i++) cin>>w[i]; solve(); int re=inf; for(int i=0;i<d;i++) { re=min(re,di[w[i]]); } cout<<re<<endl; } return 0; }