POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan
2014-02-28 13:54
375 查看
该算法的详细解释请戳:
http://www.cnblogs.com/Findxiaoxun/p/3428516.html
http://www.cnblogs.com/Findxiaoxun/p/3428516.html
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; const int MAXN=905; int father[MAXN],ancestor[MAXN]; bool visit[MAXN]; int ans[MAXN]; vector<int> map[MAXN];//save the tree vector<int> query[MAXN];//save the query int n,t,root; bool indegree[MAXN];//the indegree to find the root int getfather(int v){//path compression if(father[v]==v)return v; return father[v]=getfather(father[v]); } void aunion(int u,int v){//?? int fv=getfather(v),fu=getfather(u); father[fv]=fu; } void LCA(int id){ int len=map[id].size(); for(int i=0;i<len;i++){ int son=map[id][i]; LCA(son); aunion(id,son); } visit[id]=1; len=query[id].size(); for(int i=0;i<len;i++){ int son=query[id][i]; if(visit[son]) ans[father[getfather(son)]]++; } } void init(){ int x,y,z; for(int i=0;i<=n;i++){ map[i].clear(); query[i].clear(); } memset(visit,0,sizeof(visit)); memset(ans,0,sizeof(ans)); memset(indegree,0,sizeof(indegree)); for(int i=0;i<=n;i++)father[i]=i; for(int i=0;i<n;i++){ scanf("%d:(%d)",&x,&y); for(int j=0;j<y;j++){ scanf("%d",&z); indegree[z]=1; map[x].push_back(z); } } scanf("%d",&t); while(t--){//this method of the init is really clever while(getchar()!='('); scanf("%d%d",&x,&y); query[x].push_back(y); query[y].push_back(x); } while(getchar()!=')'); for(int i=1;i<=n;i++)if(!indegree[i])root=i;//find the root;warning:the 0 } void output(){ for(int i=1;i<=n;i++){ if(ans[i]!=0) printf("%d:%d\n",i,ans[i]); } } int main(){ while(scanf("%d",&n)!=EOF){ init(); LCA(root); output(); } return 0; }
相关文章推荐
- LCA(最近公共祖先)离线算法Tarjan+并查集
- POJ 1470 Closest Common Ancestors (最近公共祖先LCA 的离线算法Tarjan)
- POJ1986 DistanceQueries 最近公共祖先LCA 离线算法Tarjan
- tarjan离线算法-LCA最近公共祖先算法模板(详细)
- LCA最近公共祖先问题(Tarjan离线算法)
- LCA(最近公共祖先)离线算法之tarjan
- LCA(最近公共祖先)离线算法Tarjan
- 树上两点的最近公共祖先-Tarjan_LCA离线算法
- 树上两点的最近公共祖先-Tarjan_LCA离线算法
- hihocoder 1067 最近公共祖先·二(tarjan LCA 离线算法O(n))
- LCA(最近公共祖先)--tarjan离线算法 hdu 2586
- LCA最近公共祖先(tarjan离线算法)
- 最近公共祖先LCA Tarjan 离线算法
- LCA最近公共祖先 Tarjan离线算法
- POJ1986 DistanceQueries 最近公共祖先LCA 离线算法Tarjan
- Tarjan离线算法求最近公共祖先(LCA)
- POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan
- [笔记]LCA 最近公共祖先---tarjan离线算法
- [图论] LCA(最近公共祖先)Tarjan 离线算法
- LCA最近公共祖先的离线算法(Tarjan)和在线算法(ST)