poj 1470 最近公共祖先
LCA 模版
const int N = 1000; const int INF = ((1<<30)-1); struct ufind{ int f[N]; void init(int x) { for(int i=0;i<=x;i++) f[i]=i;} int find(int x) { return f[x]==x?x:f[x]=find(f[x]);} void set_friend(int i,int j){ f[find(j)]=find(i);} bool is_friend(int i,int j){ return find(i)==find(j) ? 1:0; } }uf; struct LCA{ vector<int> G[N],Q[N]; map< pair<int,int> ,int> mpp; int vis[N]; void init(int n){ uf.init(n); mpp.clear(); for(int i=0;i<=n;i++){ vis[i]=0; G[i].clear(); Q[i].clear(); } } void addG(int u,int v){ G[u].push_back(v); G[v].push_back(u); } void addQ(int u,int v){ Q[u].push_back(v); Q[v].push_back(u); } void dfs(int u,int father){ for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v!=father) { dfs(v,u); uf.set_friend(u,v); } } vis[u]=1; for(int i=0;i<Q[u].size();i++){ int v=Q[u][i]; if(vis[v]){ mpp[make_pair(u,v)]=uf.find(v); } } } }lca;
#include<iostream> #include<cstring> #include <cstdio> #include<string> #include<queue> #include<vector> #include<map> #include <set> #include<ctime> #include<cmath> #include <cstdlib> #include<algorithm> #include <iomanip> using namespace std; const int N = 1000; const int INF = ((1<<30)-1); struct ufind{ int f[N]; void init(int x) { for(int i=0;i<=x;i++) f[i]=i;} int find(int x) { return f[x]==x?x:f[x]=find(f[x]);} void set_friend(int i,int j){ f[find(j)]=find(i);} bool is_friend(int i,int j){ return find(i)==find(j) ? 1:0; } }uf; int ans[N],indegree[N];; struct LCA{ vector<int> G[N],Q[N]; //map< pair<int,int> ,int> mpp; int vis[N]; void init(int n){ uf.init(n); /*mpp.clear();*/ for(int i=0;i<=n;i++){ indegree[i]=0; ans[i]=0; vis[i]=0; G[i].clear(); Q[i].clear(); } } void addG(int u,int v){ G[u].push_back(v); G[v].push_back(u); } void addQ(int u,int v){ Q[u].push_back(v); Q[v].push_back(u); } void dfs(int u,int father){ for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v!=father) { dfs(v,u); uf.set_friend(u,v); } } vis[u]=1; for(int i=0;i<Q[u].size();i++){ int v=Q[u][i]; if(vis[v]){ ans[uf.find(v)]++; //mpp[make_pair(u,v)]=uf.find(v); } } } void solve(){ int n,m; while(scanf("%d",&n)!=EOF){ init(n); for(int i=0;i<n;i++){ int u,v,num; scanf("%d:(%d)",&u,&num); while(num--){ scanf("%d",&v); addG(u,v); indegree[v]++; } } scanf("%d",&m); for(int i=0;i<m;i++){ int u,v; while(getchar() != '('); scanf("%d%d",&u,&v); addQ(u,v); while(getchar() != ')'); } for(int i=1;i<=n;i++) if(!indegree[i]){ dfs(i,-1); break; } for(int i=1;i<=n;i++) if(ans[i]) printf("%d:%d\n",i,ans[i]); } } }lca; int main(){ lca.solve(); }