Time
Limit: 10000/5000 MS (Java/Others) Memory Limit:
32768/32768 K (Java/Others)
Total Submission(s):
3937 Accepted Submission(s):
1144
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<queue> #include<vector> #include<stdlib.h> #include<set> #include<map> #include<cmath> using namespace std; #define maxn 10000+5 int pre[maxn][20],vit[maxn],n,m,c,deep[maxn]; __int64 lenth[maxn][20]; vector<int >ko[maxn],dis[maxn]; void dfs(int x,int de) { vit[x]=1; deep[x]=de; for(int i=0; i<ko[x].size(); i++) { int to=ko[x][i]; if(!vit[to]) { pre[to][0]=x; lenth[to][0]=dis[x][i]; dfs(to,de+1); } } } int main() { int i,j; while(cin>>n>>m>>c) { for(i=1; i<=n; i++) { ko[i].clear(); dis[i].clear(); } for(i=1; i<=m; i++) { int u,v,l; scanf("%d%d%d",&u,&v,&l); ko[u].push_back(v); dis[u].push_back(l); ko[v].push_back(u); dis[v].push_back(l); } memset(vit,0,sizeof(vit)); memset(pre,-1,sizeof(pre)); memset(lenth,0,sizeof(lenth)); memset(deep,0,sizeof(deep)); for(i=1; i<=n; i++) if(!vit[i]) { pre[i][0]=0; dfs(i,1); } for(i=1; i<20; i++) for(j=1; j<=n; j++) { if(pre[j][i-1]!=-1) { pre[j][i]=pre[ pre[j][i-1] ][i-1]; lenth[j][i]=lenth[j][i-1]+lenth[ pre[j][i-1] ][i-1]; } } while(c--) { int u,v,dd,num=0; __int64 mm=0; scanf("%d%d",&u,&v); if(deep[u]<deep[v]) swap(u,v); dd=deep[u]-deep[v]; while(dd) //使 u v处于同一点 { if(dd&1) { mm+=lenth[u][num]; u=pre[u][num]; } ++num; dd>>=1; } if(u==v) { if(u>0) printf("%I64d\n",mm); else printf("Not connected\n"); continue; } while(u!=v) { int If; for(i=0; i<20; i++) { if(pre[u][i]==pre[v][i]) { If=i; break; } } if(If==0) { if(pre[u][0]>0) { mm+=lenth[u][0]+lenth[v][0]; printf("%I64d\n",mm); } else printf("Not connected\n"); break; } else { mm+=lenth[u][If-1]+lenth[v][If-1]; u=pre[u][If-1]; v=pre[v][If-1]; } } } } }
Lca hdu 2874 Connections between cities,布布扣,bubuko.com
Lca hdu 2874 Connections between cities
原文:http://www.cnblogs.com/ainixu1314/p/3608730.html