1 #include<stdio.h> 2 #define INF 0x3f3f3f3f 3 #define N 1010 4 int vis[N], dis[N], cost[N][N]; 5 int n, m, s, w, p, q, t; 6 int min(int x, int y) 7 { 8 9 return x < y ? x : y; 10 } 11 void dijkstra(int beg) 12 { 13 int u, v; 14 for(u = 1; u <= n; u++) 15 { 16 vis[u] = 0; 17 dis[u] = INF; 18 } 19 dis[beg] = 0; 20 while(true) 21 { 22 v = -1; 23 for(u = 1; u <= n; u++) 24 if(!vis[u] && (v == -1 || dis[u] < dis[v])) 25 v = u; 26 if(v == -1) 27 break; 28 vis[v] = 1; 29 for(u = 1; u <= n; u++) 30 dis[u] = min(dis[u], dis[v] + cost[v][u]); 31 } 32 } 33 int main() 34 { 35 int i , j; 36 while(~scanf("%d%d%d", &n, &m, &s)) 37 { 38 for(i = 1; i <= n; i++) 39 for(j = i; j <= n; j++) 40 cost[i][j] = cost[j][i] = INF; 41 while(m--) 42 { 43 scanf("%d%d%d", &p, &q, &t); 44 if(cost[q][p] > t) 45 cost[q][p] = t; 46 } 47 scanf("%d", &w); 48 int sum = INF, b; 49 dijkstra(s); 50 for(i = 1; i <= w; i++) 51 { 52 scanf("%d", &b); 53 if(sum > dis[b]) 54 sum = dis[b]; 55 } 56 57 if(sum == INF) 58 printf("-1\n"); 59 else 60 printf("%d\n", sum); 61 } 62 return 0; 63 }
spfa代碼:node
1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #define N 10000000 5 #define M 1010 6 #define INF 0x3f3f3f3f 7 using namespace std; 8 int n, m, s, cnt; 9 int vis[M], head[M], time[M]; 10 queue<int>q; 11 struct node 12 { 13 int from, to, cost, next; 14 }road[N]; 15 void add(int x, int y, int z) 16 { 17 node e = {x, y, z, head[x]}; 18 road[cnt] = e; 19 head[x] = cnt++; 20 } 21 void spfa() 22 { 23 while(!q.empty()) 24 { 25 int u = q.front(); 26 q.pop(); 27 vis[u] = 0; 28 for(int i = head[u]; i != -1; i = road[i].next) 29 { 30 int v = road[i].to; 31 if(time[v] > time[u] + road[i].cost) 32 { 33 time[v] = time[u] + road[i].cost; 34 if(!vis[v]) 35 { 36 vis[v] = 1; 37 q.push(v); 38 } 39 } 40 } 41 } 42 } 43 int main() 44 { 45 while(~scanf("%d%d%d", &n, &m, &s)) 46 { 47 48 memset(head, -1, sizeof(head)); 49 memset(vis, 0, sizeof(vis)); 50 memset(time, INF, sizeof(time)); 51 while(m--) 52 { 53 int p, q, t; 54 scanf("%d%d%d", &p, &q, &t); 55 add(p, q, t); 56 //add(q, p, t); 57 } 58 int w; 59 scanf("%d", &w); 60 while(w--) 61 { 62 int posi; 63 scanf("%d", &posi); 64 q.push(posi); 65 time[posi] = 0; 66 vis[posi] = 1; 67 } 68 spfa(); 69 if(time[s] == INF) 70 printf("-1\n"); 71 else 72 printf("%d\n", time[s]); 73 } 74 return 0; 75 }