LCA之tarjan模板
2017-07-18 10:19
239 查看
#include<cstdio> #include<cstring> #include<iostream> #include<cstdlib> #include<cmath> using namespace std; const int maxx=500010; int be[maxx],ne[maxx*2],to[maxx*2],e=0; int bee[maxx],nee[maxx*2],too[maxx*2],w[maxx*2],ee=0; int ans[maxx],fa[maxx],root; bool p[maxx]; void ad(int x,int y){ to[++e]=y; ne[e]=be[x]; be[x]=e; } void add(int x,int y,int z){ too[++ee]=y; nee[ee]=bee[x]; bee[x]=ee; w[ee]=z; } int find(int x){ return fa[x]=fa[x]==x?x:find(fa[x]); } void dfs(int id){ p[id]=1; fa[id]=id; for(int u=be[id];u;u=ne[u]){ int go=to[u]; if(!p[go]){ dfs(go); fa[go]=id; } } for(int u=bee[id];u;u=nee[u]){ int go=too[u]; if(p[go]) ans[w[u]]=find(go); } } int read(){ char x; while((x = getchar()) > '9' || x < '0') ; int u = x - '0'; while((x = getchar()) <= '9' && x >= '0') u = u * 10 + x - '0'; return u; } int main(){ #ifndef ONLINE_JUDDGE freopen("input.in","r",stdin); freopen("output.out","w",stdout); #endif int i,j,k,m,n; n=read(); m=read(); root=read(); for(i=1;i<n;i++){ j=read(); k=read(); ad(j,k); ad(k,j); } for(i=1;i<=m;i++){ j=read(); k=read(); add(j,k,i); add(k,j,i); } dfs(root); for(i=1;i<=m;i++) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- hiho一下 第十五周 最近公共祖先·二 - 更新一下tarjan离线LCA模板
- hdu 2874 lca-tarjan离线算法(模板)
- LCA Tarjan及倍增模板(POJ 1330)
- tarjan离线算法-LCA最近公共祖先算法模板(详细)
- HDU 2586 【LCA-Tarjan-模板】
- 【模板】LCA Tarjan
- 洛谷 P3379 【模板】最近公共祖先(LCA) (在线倍增+离线Tarjan)
- Tarjan--LCA算法的个人理解即模板
- LCA-离线tarjan模板
- 最近公共祖先LCA模板(Tarjan/RMQ)
- 连通分量模板:tarjan: 求割点 && 桥 && 缩点 && 强连通分量 && 双连通分量 && LCA(近期公共祖先)
- LCA 离线算法 tarjan 总结 与模板题
- HDOJ2586 lca查询 tarjan模板程序
- hdu2586(lca模板 / tarjan离线 + RMQ在线)
- LCA模板 Tarjan
- Tarjan_LCA模板
- poj3694(lca + tarjan求桥模板)
- 【LCA】Tarjan离线算法(并查集+dfs)模板
- POJ1330 Nearest Common Ancestors (tarjan离线求LCA模板)
- HDU2586 LCA_Tarjan模板题