http://acm.hdu.edu.cn/showproblem.php?pid=2066
把与草儿相连的城市最短距离置为0,然后进行dijkstra,在t个城市里找出距离最近的一个即可。
1 #include <iostream> 2 #include <vector> 3 #include <queue> 4 #include <cstdio> 5 using namespace std; 6 7 const int maxn = 1010; 8 const int INF = 1<<29; 9 struct edge { 10 int to,cost; 11 edge(){} 12 edge( int x,int y ) { 13 to=x; 14 cost=y; 15 } 16 }; 17 18 typedef pair<int,int>P; 19 vector<edge>G[maxn]; 20 int d[maxn],s[maxn],e[maxn]; 21 int T,S,D,n; 22 23 void dijkstra() { 24 priority_queue<P,vector<P>,greater<P> >que; 25 for(int i=1;i<=n;i++) d[i]=INF; 26 for(int i=1;i<=S;i++) 27 { 28 d[s[i]]=0; 29 que.push(P(0,s[i])); 30 } 31 while(!que.empty()) { 32 P p=que.top(); que.pop(); 33 int v=p.second; 34 if(d[v]<p.first) continue; 35 for(int i=0;i<G[v].size();i++) { 36 edge e=G[v][i]; 37 if(d[e.to]>d[v]+e.cost) { 38 d[e.to]=d[v]+e.cost; 39 que.push(P(d[e.to],e.to)); 40 } 41 } 42 } 43 } 44 45 int main() 46 { 47 //freopen("a.txt","r",stdin); 48 while(~scanf("%d%d%d",&T,&S,&D)) 49 { 50 for(int i=1;i<=maxn;i++) G[i].clear(); 51 n=0; 52 int a,b,c,v; 53 for(int i=1;i<=T;i++) 54 { 55 scanf("%d%d%d",&a,&b,&c); 56 // printf("%d %d %d ",a,b,c); 57 G[a].push_back(edge(b,c)); 58 G[b].push_back(edge(a,c)); 59 if(a>n) n=a; 60 if(b>n) n=b; 61 } 62 for(int i=1;i<=S;i++) scanf("%d",&s[i]); 63 for(int i=1;i<=D;i++) scanf("%d",&e[i]); 64 dijkstra(); 65 int ans=INF; 66 for(int i=1;i<=D;i++) 67 if(d[e[i]]<ans) ans=d[e[i]]; 68 printf("%d ",ans); 69 70 } 71 return 0; 72 }