zoukankan      html  css  js  c++  java
  • 【Uva 1220】Party at Hali-Bula

    Link:https://cn.vjudge.net/contest/170078#problem/M

    Description

    求一个树的最大独立子集;
    (即树的一个点集,这个点集中任意两个点,都不相连)
    然后,问你这个点集是不是唯一的;

    Solution

    设d[i][0],f[i][0],表示以i为根节点的子树在i节点不选的时候的最大独立子集,f[i][0],表示在不选i的时候,这个最大独立子集是否唯一;
    d[i][1],f[i][1]的定义类似,只不过变成了i这个点不选;
    对于第i个节点要选的情况;
    儿子节点只能都不选
    d[i][0]=d[j][1]
    (ji,f[j][1]true,f[i][0]true)
    对于第i个节点不选的情况
    儿子节点可选、可不选
    d[i][1]=max(d[j][0],d[j][1])
    这里,如果d[j][0]==d[j][1],或者d[j][0]和d[j][1]中那个较大值的f值为false;
    则f[i][1]为false;否则为true;
    最后,在根节点1上面加一个0节点
    直接输出d[0][1];
    ->因为0节点不选的话,对应1节点可选可不选;
    然后根据f[0][1]判断YES和NO;

    NumberOf WA

    1

    Reviw

    d[y][0]写成了dy[0]…
    然后dy是那个模板里的四个方向数组….

    Code

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 210;
    
    int n,cnt;
    string boss;
    map <string,int> dic;
    vector <int> g[N];
    int d[N][2];
    bool f[N][2];
    
    void dfs(int x){
        d[x][0] = 1,f[x][0] = true;
        d[x][1] = 0,f[x][1] = true;
        int len = g[x].size();
        rep1(i,0,len-1){
            int y = g[x][i];
            dfs(y);
            d[x][0]+=d[y][1],f[x][0] = f[x][0] && f[y][1];
            if (d[y][0]==d[y][1]) f[x][1] = false,d[x][1] += d[y][1];
            if (d[y][0] > d[y][1]){
                d[x][1] += d[y][0];
                if (!f[y][0]) f[x][1] = false;
            }
            if (d[y][0] < d[y][1]){
                d[x][1] += d[y][1];
                if (!f[y][1]) f[x][1] = false;
            }
        }
    }
    
    int main(){
        //Open();
        Close();
        while (cin >> n && n){
            rep1(i,0,n) g[i].clear();
            cnt = 0;
            dic.clear();
            cin >> boss;
            dic[boss] = ++cnt;
            string x,y;
            rep1(i,1,n-1){
                cin >> x >> y;
                if (dic[x]==0) dic[x]=++cnt;
                if (dic[y]==0) dic[y]=++cnt;
                int xx = dic[x],yy = dic[y];
                g[yy].pb(xx);
            }
            g[0].pb(1);
            dfs(0);
            cout << d[0][1] <<' ';
            if (f[0][1])
                cout <<"Yes"<<endl;
            else
                cout <<"No"<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    利用memcache实现,防止连续点击及每天点击次数
    Laravel 5.5 FormRequest 自定义表单请求验证类
    memcache安装及使用
    php查看当天访问量代码,以及每天访问量历史记录(本方法是存文件里,不是存数据库)
    SQL语句多个字段排序
    【C++】rand()函数,时间种子
    【C++】颜色的设置
    【堆栈应用一】一个数divided=几个最小质因数的乘积
    【JSP】中文乱码问题
    【汇编】MASM6.15几个简单的汇编程序
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626192.html
Copyright © 2011-2022 走看看