HDU 2874 Connections between cities
LCA 因为说是没环 所以必定是找最近公共祖先。。。。
代码别人的 随便改了下 模板吗? 但这个人写的都是 乱七八糟的名字的变量=-=
#include<cstdio> //using namespace std; const int mm=2222222; const int mn=11111; int t[mm],d[mm],p[mm],ans[mm]; int h[mn],q[mn],f[mn],id[mn],dis[mn]; bool vis[mn]; int i,j,k,n,m,c,e,cnt; void add(int u,int v,int c,int h[]) { t[e]=v,d[e]=c,p[e]=h[u],h[u]=e++; t[e]=u,d[e]=c,p[e]=h[v],h[v]=e++; } int find(int x) { if(f[x]==x)return x; return f[x]=find(f[x]); } void tarjan(int u) { int i,v; id[u]=cnt; vis[f[u]=u]=1; for(i=q[u];i;i=p[i]) if(vis[v=t[i]]) ans[d[i]]=(id[v]==id[u])?dis[u]+dis[v]-(dis[find(v)]<<1):-1; for(i=h[u];i;i=p[i]) if(!vis[v=t[i]]) dis[v]=dis[u]+d[i],tarjan(v),f[v]=u; } int main() { while(scanf("%d%d%d",&n,&m,&c)!=-1) { for(i=e=1;i<=n;++i)h[i]=q[i]=id[i]=vis[i]=0; while(m--) { scanf("%d %d %d", &i, &j, &k); add(i,j,k,h); } for(k=1;k<=c;++k){ scanf("%d %d", &i, &j); add(i,j,k,q); } for(i=cnt=1;i<=n;++i,++cnt) if(!vis[i])dis[i]=0,tarjan(i); for(i=1;i<=c;++i) if(ans[i]<0)puts("Not connected"); else printf("%d\n", ans[i]); } return 0; }