注意这是一个有向图! 多起点,一终点 反过来,看成一个起点,多个终点,找最短路 因为是有向图 所以u->v 要也要反过来成为v->u
Sample Input
5 8 5 //结点数 边数 终点
1 2 2 //u v w
1 5 3
1 3 4
2 4 7
2 5 6
2 3 5
3 5 1
4 5 1
2
2 3 //起点
4 3 4
1 2 3
1 3 4
2 3 2
1
1
Sample Output
1
-1
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # define LL long long 7 using namespace std ; 8 9 const int MAXN=1010; 10 const int INF=0x3f3f3f3f; 11 int n ; 12 bool vis[MAXN]; 13 int cost[MAXN][MAXN] ; 14 int lowcost[MAXN] ; 15 int pre[MAXN]; 16 void Dijkstra(int beg) 17 { 18 for(int i=0;i<n;i++) 19 { 20 lowcost[i]=INF;vis[i]=false;pre[i]=-1; 21 } 22 lowcost[beg]=0; 23 for(int j=0;j<n;j++) 24 { 25 int k=-1; 26 int Min=INF; 27 for(int i=0;i<n;i++) 28 if(!vis[i]&&lowcost[i]<Min) 29 { 30 Min=lowcost[i]; 31 k=i; 32 } 33 if(k==-1)break; 34 vis[k]=true; 35 for(int i=0;i<n;i++) 36 if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]) 37 { 38 lowcost[i]=lowcost[k]+cost[k][i]; 39 pre[i]=k; 40 } 41 } 42 } 43 44 int main () 45 { 46 //freopen("in.txt","r",stdin) ; 47 int m , s ; 48 while (scanf("%d %d %d" , &n , &m , &s) !=EOF) 49 { 50 51 int u , v , w ; 52 int i , j ; 53 memset(cost, INF, sizeof(cost)); 54 while(m--) 55 { 56 scanf("%d%d%d" , &u , &v , &w) ; 57 if (w < cost[v-1][u-1]) //防止重边 58 { 59 cost[v-1][u-1] = w ; 60 } 61 } 62 Dijkstra(s-1) ; 63 scanf("%d" , &m) ; 64 int e ; 65 int MIN = INF ; 66 while(m--) 67 { 68 scanf("%d" , &e) ; 69 if (lowcost[e-1] < MIN) 70 MIN = lowcost[e-1] ; 71 } 72 73 if (MIN != INF) 74 printf("%d\n" , MIN) ; 75 else 76 printf("-1\n") ; 77 } 78 79 return 0 ; 80 }