图论 tarjan 求 LCA 祖孙询问
2017-09-11 20:52
211 查看
【题目描述】:
已知一棵n个节点的有根树。有m个询问。每个询问给出了一对节点的编号x和y,询问x与y的祖孙关系。【输入描述】:
输入第一行包括一个整数n表示节点个数。接下来n行每行一对整数对a和b表示a和b之间有连边。如果b是-1,那么a就是树的根。第n+2行是一个整数m表示询问个数。接下来m行,每行两个正整数x和y。【输出描述】:
对于每一个询问,输出1:如果x是y的祖先,输出2:如果y是x的祖先,否则输出0。【样例输入】:
10 234 -1 12 234 13 234 14 234 15 234 16 234 17 234 18 234 19 234 233 19 5 234 233 233 12 233 13 233 15 233 19
【样例输出】:
1 0 0 0 2
【时间限制、数据范围及描述】:
时间:1s 空间:128M对于30%的数据,n,m≤1000。对于100%的.据,n,m≤40000,每个节点的编号都不超过40000。AC代码:#include<cstdio> #include<iostream> using namespace std; struct node{ int u,v,next,lca; }q[40005*2],e[40005*2]; int n,fa[40005*2],cnt,hq[40005*2],he[40005*2],p,m; bool vis[40005*2]; void addq(int u,int v){ cnt++; q[cnt].next=hq[u]; hq[u]=cnt; q[cnt].v=v; q[cnt].u=u; } void adde(int u,int v){ cnt++; e[cnt].next=he[u]; he[u]=cnt; e[cnt].v=v; } int find(int x){ if(fa[x]==x)return x; else return fa[x]=find(fa[x]); } int dfs(int x){ fa[x]=x; vis[x]=1; for(int i=he[x];i;i=e[i].next){ if(!vis[e[i].v]){ dfs(e[i].v); fa[e[i].v]=x; } } for(int i=hq[x];i;i=q[i].next){ if(vis[q[i].v]){ q[i].lca=find(q[i].v); if(i%2){ q[i+1].lca=q[i].lca; } else{ q[i-1].lca=q[i].lca; } } } } int query(int i){ if(q[i].lca==q[i].u)return 2; if(q[i].lca==q[i].v)return 1; return 0; } int main(){ int u,v; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&u,&v); if(v==-1){ p=u;continue; } adde(u,v); adde(v,u); } cnt=0;scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); addq(u,v); addq(v,u); } dfs(p); for(int i=1;i<=m;i++){ printf("%d\n",query(i*2)); } return 0; }
相关文章推荐
- NOIP级别 祖孙询问 LCA 解题报告
- 祖孙询问 纪中3054 LCA
- 祖孙询问_纪中3054_lca
- hdu2586 How far away ? 【图论-Tarjan-Lca】
- 图论--tarjan求lca
- 图论 LCA离线算法 Tarjan
- poj3694 Network 【图论-Tarjan-Lca】
- [图论] LCA(最近公共祖先)Tarjan 离线算法
- POJ---1986-Distance Queries(LCA-Tarjan)
- HDU - 2586 How far away ?(tarjan离线做法求lca)
- hdu 2586 How far away ? (LCA 离线tarjan)
- POJ 1330 Tarjan LCA、ST表(其实可以数组模拟)
- POJ1470 LCA(tarjan离线求最近公共祖先)
- LCA tarjan 离线算法学习
- 【Tarjan】洛谷P3379 Tarjan求LCA
- Tarjan离线算法求LCA小结
- hdu2586 lca_tarjan的应用
- The merchant(LCA——Tarjan高级应用)
- hdu 4547(tarjan LCA)
- HDU4547(CD操作)LCA+Tarjan离线算法