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 }