zoukankan      html  css  js  c++  java
  • Poj1470 Closest Common Ancestors LCA

      LCA裸题。。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<vector>
    using namespace std;
    const int maxn = 1111;
    int head[maxn];
    int len;
    struct Node
    {
        int to; int next;
    }e[maxn * 2];
    int father[maxn];
    int color[maxn];
    int vis[maxn];
    int gg[maxn];
    vector <int> q[maxn];
    void add(int from, int to)
    {
        e[len].to = to;
        e[len].next = head[from];
        head[from] = len++;
    }
    
    int getfather(int x)
    {
        if (father[x] != x) father[x] = getfather(father[x]);
        return father[x];
    }
    
    void un(int a, int b)
    {
        int fa = getfather(a); int fb = getfather(b);
        father[fb] = fa;
    }
    
    
    void dfs(int x)
    {
        for (int i = head[x]; ~i; i = e[i].next){
            int cc = e[i].to;
            dfs(cc);
            un(x, cc);
        }
        color[x] = 1;
        for (int i = 0; i <q[x].size(); i++){
            int t = q[x][i];
            if (color[t]){
                int t1 = getfather(q[x][i]);
                vis[t1]++;
            }
        }
    }
    
    void init(int n)
    {
        len = 0;
        memset(head, -1, sizeof(head));
        for (int i = 1; i <= n; i++)
            father[i] = i;
        memset(head, -1, sizeof(head));
        for (int i = 1; i <= n; i++)
            q[i].clear();
        memset(color, 0, sizeof(color));
        for (int i = 1; i <= n; i++)
            vis[i] = 0;
        for (int i = 1; i <= n; i++)
            gg[i] = 0;
    }
    
    
    int main()
    {
        int n;
        while (cin >> n){
            init(n);
            int m, a, b, c;
            for (int i = 0; i<n; i++){
                scanf("%d", &a);
                scanf(":(%d)", &b);
                for (int j = 0; j<b; j++){
                    scanf("%d", &c);
                    add(a, c);
                    gg[c] = 1;
                }
            }
            scanf("%d", &m);
            while (m--){
                scanf(" (%d %d)", &a, &b);
                //  printf("%d %djiji
    ",a,b);
                q[a].push_back(b);
                q[b].push_back(a);
            }
            int root;
            for (int i = 1; i <= n; i++) if (!gg[i]){
                root = i; break;
            }
            dfs(root);
            for (int i = 1; i <= n; i++){
                if (vis[i]){
                    printf("%d:%d
    ", i, vis[i]);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    HNOI2003 消防局的设立
    APIO2007 风铃
    SDOI2006 保安站岗
    消息传递
    [POI2008]STA-Station
    JLOI2015 城池攻占
    BOI2004 sequence
    Monkey King
    APIO2012 Dispatching
    HTML meta 文本 格式排版 链接图表 列表 表单 frame后台布局实例
  • 原文地址:https://www.cnblogs.com/yigexigua/p/4083561.html
Copyright © 2011-2022 走看看