HDOJ 2874 Connections between cities

分析

  LCA,只不过多了图不连通的情形,用Tarjan离线处理,用visited[i]的值来表示i属于哪个集合..

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<algorithm>
 5 #include<iostream>
 6 #define N 10010
 7 using namespace std;
 8 int root[N],dis[N],n,m,k,ans[N*100];
 9 int visited[N],cnt;
10 struct Edge{
11     int next,len;
12 };
13 vector<Edge>T[N],Q[N];
14 int find(int x){
15     return x==root[x]?root[x]:root[x]=find(root[x]);
16 }
17 void dfs(int rt,int d){
18     visited[rt]=cnt;
19     dis[rt]=d;
20     for(int i=0;i<Q[rt].size();i++){
21         if(visited[Q[rt][i].next]){
22             if(visited[Q[rt][i].next]==visited[rt]){
23 
24                 ans[Q[rt][i].len]=dis[rt]+dis[Q[rt][i].next]-2*dis[find(Q[rt][i].next)];
25             }
26             else
27                 ans[Q[rt][i].len]=-1;
28         }
29     }
30     for(int i=0;i<T[rt].size();i++){
31         if(!visited[T[rt][i].next]){
32             dfs(T[rt][i].next,d+T[rt][i].len);
33             root[T[rt][i].next]=rt;
34         }
35     }
36 }
37 
38 int main(){
39     while(~scanf("%d%d%d",&n,&m,&k)){
40         cnt=0;
41         for(int i=1;i<=n;i++){
42             T[i].clear();
43             Q[i].clear();
44             visited[i]=0;
45             root[i]=i;
46             dis[i]=0;
47         }
48         for(int i=1;i<=m;i++){
49             int a,b,c;
50             scanf("%d%d%d",&a,&b,&c);
51             Edge E;
52             E.next=a,E.len=c;
53             T[b].push_back(E);
54             E.next=b;
55             T[a].push_back(E);
56         }
57         for(int i=1;i<=k;i++){
58             int a,b;
59             scanf("%d%d",&a,&b);
60             Edge E;
61             E.next=a,E.len=i;
62             Q[b].push_back(E);
63             E.next=b;
64             Q[a].push_back(E);
65         }
66         for(int i=1;i<=n;i++)
67             if(!visited[i]){
68                 ++cnt;
69                 dfs(i,0);
70             }
71         for(int i=1;i<=k;i++)
72             if(ans[i]==-1)
73                 puts("Not connected");
74             else
75                 printf("%d\n",ans[i]);
76     }
77     return 0;
78 }
posted @ 2012-09-15 00:06  silver__bullet  阅读(121)  评论(0编辑  收藏  举报