六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 27|回复: 0

poj1470——Closest Common Ancestors//LCA

[复制链接]

升级  93.8%

309

主题

309

主题

309

主题

进士

Rank: 4

积分
969
 楼主| 发表于 2013-1-26 13:38:05 | 显示全部楼层 |阅读模式
果然A得辛苦,我想是用错模板了。囧,好累。http://www.cppblog.com/abilitytao/archive/2009/09/21/96886.html
#include<iostream>#include<string>#include<cstdio>#include<vector>using namespace std;const int maxn=906;vector<int >p[maxn];class node{public:int v,next;};node g[maxn*4];int head[maxn],in[maxn],time[maxn],vis[maxn];int f[maxn],r[maxn],ancestor[maxn];int cnt,n,m;void ini(){int i;for(i=1;i<=n;i++){f[i]=i;r[i]=1;in[i]=0;time[i]=0; head[i]=0;vis[i]=0;ancestor[i]=0;p[i].clear ();}cnt=0;}void read(){int i,a,b,c,k;char ch;for(i=0;i<n;i++){scanf("%d:(%d)",&a,&b);for(k=0;k<b;k++){scanf("%d",&c);g[++cnt].v =c;g[cnt].next =head[a];head[a]=cnt;in[c]++;}}scanf("%d",&m);for(i=0;i<m;i++){while(getchar()!='(');scanf("%d %d)",&a,&b);p[a].push_back (b);p[b].push_back (a);}}int Find(int u){if(f[u]==u) return u;f[u]=Find(f[u]);return f[u];}void Union(int u,int v){int a=Find(u);int b=Find(v);if(a==b) return ;if(r[a]<r[b]){f[a]=b;r[b]+=r[a];}else {f[b]=a;r[a]+=r[b];}}void LCA(int u){ancestor[u]=u;int i;for(i=head[u];i;i=g[i].next ){int v=g[i].v;LCA(v);Union(u,v);ancestor[Find(u)]=u;}vis[u]=1;int size=p[u].size();for(i=0;i<size;i++){if(vis[p[u][i]]==1)time[ancestor[Find(p[u][i])]]++;}}int main(){int i;while(scanf("%d",&n)!=EOF){ini();read();for(i=1;i<=n;i++)if(!in[i]) break;LCA(i);for(i=1;i<=n;i++)if(time[i])printf("%d:%d\n",i,time[i]);}return 0;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表