多次dijkstra 一次AC
#include<bits/stdc++.h> using namespace std; int m1[1005][1005]; int vis[1005];int dis[1005]; #define INF 99999 int n=1004,e,cas; int a1[1000];int a2[1000]; void dijkstra(int v0) { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++)dis[i]=m1[v0][i]; // for(int i=1;i<=n;i++)printf("%d ",dis[i]);cout<<endl; vis[v0]=1; for(int i=0;i<n-1;i++) { int minn=INF,u=v0; for(int j=1;j<=n;j++) { if(vis[j]==0&&dis[j]<minn) { u=j;minn=dis[j]; } } vis[u]=1; for(int j=1;j<=n;j++) { if(vis[j]==0&&dis[u]+m1[u][j]<dis[j]) { dis[j]=dis[u]+m1[u][j]; } } } } int main() { int cas,n1,n2; while(scanf("%d%d%d",&cas,&n1,&n2)==3) { for(int i=1;i<=1004;i++) for(int j=1;j<=1004;j++) { if(i==j)m1[i][j]=0; else m1[i][j]=INF; } while(cas--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(m1[b][a]>c)m1[b][a]=m1[a][b]=c; } for(int i=1;i<=n1;i++) scanf("%d",&a1[i]); for(int i=1;i<=n2;i++) scanf("%d",&a2[i]); int min1=INF; for(int i=1;i<=n1;i++) { dijkstra(a1[i]); for(int i=1;i<=n2;i++) if(min1>dis[a2[i] ]){min1=dis[ a2[i] ];} } if(min1!=INF) printf("%d\n",min1); else printf("-1\n"); } }