poj 1470 Closest Common Ancestors
http://poj.org/problem?id=1470
裸LCA:读入数据很诡异。
View Code
#include<stdio.h> #include<string.h> #include<iostream> #include<vector> #include<algorithm> #include<stdlib.h> using namespace std; const int maxn = 1000; struct nd { int to,next; }edge[maxn*2]; vector<int>qes[maxn]; int vis[maxn],ans[maxn]; int in[maxn],f[maxn]; int ecnt,head[maxn],fa[maxn]; void add(int s,int t) { edge[ecnt].to = t; edge[ecnt].next = head[s]; head[s] = ecnt++; } int Find(int x) { if(x!=f[x]) f[x] = Find(f[x]); return f[x]; } void LCA(int u) { int i,v,x,y; ans[u] = u; for(i = head[u]; i != -1; i = edge[i].next) { v = edge[i].to; LCA(v); x = Find(u); y = Find(v); if(x!=y) f[y] = x; ans[Find(u)] = u; } vis[u] = 1; for(i = 0; i < qes[u].size(); ++ i){ v = qes[u][i]; if(vis[v]) fa[ans[Find(v)]]++; } } inline bool get(int &a) { char c; while(((c=getchar())<'0'||c>'9')&&c!=EOF); if(c==EOF)return 0; for(a=0;c>='0'&&c<='9';c=getchar())a=a*10+c-'0'; return 1; } int main() { int i,s,t,k,n; while(get(n)) { memset(vis,0,sizeof(vis)); memset(ans,0,sizeof(ans)); memset(in,0,sizeof(in)); memset(fa,0,sizeof(fa)); memset(head,-1,sizeof(head)); for(i = 0; i <= n; ++ i) qes[i].clear(); for(i = 0; i <= n; ++ i) f[i] = i; ecnt = 0; for(i = 1; i <= n; ++ i) { get(s); get(k); while(k--) { get(t); add(s,t); in[t]++; } } get(k); while(k--) { get(s); get(t); if(s==t){ fa[s]++; continue;} qes[s].push_back(t); qes[t].push_back(s); } for(i = 1; i <= n; ++ i) if(!in[i])break; LCA(i); for(i = 1; i <= n; ++ i) if(fa[i]) printf("%d:%d\n",i,fa[i]); }return 0; }

浙公网安备 33010602011771号