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();
}
posted @ 2012-05-04 21:02  HaoHua_Lee  阅读(189)  评论(0编辑  收藏  举报