http://acm.hdu.edu.cn/showproblem.php?pid=2066
用来练习SPFA
有多个出发点事不必做多次的SPFA,只要把多个顶点初始化为0即.
//View Code
1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 using namespace std; 5 const int MAX = 1100; 6 const int INF = 0x3fffffff; 7 int map[MAX][MAX]; 8 int start[MAX]; 9 int End[MAX]; 10 int dis[MAX]; 11 int used[MAX]; 12 int mark; 13 int T,S,D; 14 int SPFA() 15 { 16 int i; 17 for(i=0;i<mark+1;i++) 18 { 19 dis[i] = INF; 20 } 21 queue <int> q; 22 for(i=0;i<S;i++) 23 { 24 dis[start[i]] = 0; 25 q.push(start[i]); 26 used[start[i]] = 1; 27 } 28 while(!q.empty()) 29 { 30 int mid; 31 mid = q.front(); 32 q.pop(); 33 used[mid] = 0; 34 for(i=0;i<mark+1;i++) 35 { 36 if(dis[i] > dis[mid] + map[mid][i]) 37 { 38 dis[i] = dis[mid] + map[mid][i]; 39 if(!used[i]) 40 { 41 q.push(i); 42 used[i] = 1; 43 } 44 } 45 } 46 } 47 int MIN = INF; 48 for(i=0;i<D;i++) 49 { 50 MIN = min(MIN,dis[End[i]]); 51 } 52 return MIN; 53 } 54 int main() 55 { 56 while(cin>>T>>S>>D) 57 { 58 int i,j; 59 for(i=0;i<MAX;i++) 60 { 61 for(j=0;j<MAX;j++) 62 { 63 map[i][j] = INF; 64 } 65 } 66 mark = 0; 67 for(i=0;i<T;i++) 68 { 69 int a,b,c; 70 cin>>a>>b>>c; 71 if(c < map[a][b]) 72 { 73 map[a][b] = map[b][a] = c; 74 } 75 mark = max(mark,a); 76 mark = max(mark,b); 77 } 78 for(i=0;i<S;i++) 79 { 80 cin>>start[i]; 81 } 82 for(i=0;i<D;i++) 83 { 84 cin>>End[i]; 85 } 86 cout<<SPFA()<<endl; 87 } 88 return 0; 89 }