zoukankan      html  css  js  c++  java
  • Party at Hali-Bula UVA

    Party at Hali-Bula

     UVA - 1220 

    题意:选一个公司的人去参加晚会,要求不能选有直接上下级关系的人,问最多选多少人去,并判断方案是否唯一。

    树的最大独立集,并判断是否唯一。

    d[u][1]表示选u,d[u][0]表示不选u

    f[u][1]==1表示选u的情况下唯一,f[u][1]==0表示不唯一

    f[u][0]为不选u的情况下的唯一性

     1 #include <cstdio>
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 const int maxn=220;
     5 map<string,int> m;
     6 int n;
     7 struct edge{
     8     int v,nex;
     9 }e[maxn];
    10 int head[maxn];
    11 int cnt=0;
    12 void add(int u,int v){
    13     e[cnt].v=v;
    14     e[cnt].nex=head[u];
    15     head[u]=cnt++;
    16 }
    17 string s1,s2;
    18 int d[maxn][2],f[maxn][2];
    19 void dfs(int u){
    20     int i=head[u];
    21     if(i==-1){
    22         d[u][0]=0;
    23         f[u][0]=1;
    24         d[u][1]=1;
    25         f[u][1]=1;
    26         return ;
    27     }
    28     f[u][1]=f[u][0]=1;
    29     for(;i!=-1;i=e[i].nex){
    30         int v=e[i].v;
    31         dfs(v);
    32         d[u][0]+=max(d[v][1],d[v][0]);
    33         d[u][1]+=d[v][0];
    34         if(!f[v][0]) f[u][1]=0;
    35         if(d[v][1]==d[v][0]) f[u][0]=0;
    36         if(d[v][1]>d[v][0]&&f[v][1]==0) f[u][0]=0;
    37         if(d[v][0]>d[v][1]&&f[v][0]==0) f[u][0]=0;
    38     }
    39     d[u][1]++;
    40     return ;
    41 }
    42 int main(){
    43     while(scanf("%d",&n)&&n){
    44         m.clear();
    45         int id=2;
    46         cnt=0;
    47         memset(head,-1,sizeof(head));
    48         memset(d,0,sizeof(d));
    49         memset(f,0,sizeof(f));
    50         cin>>s1;
    51         m[s1]=1;
    52         for(int i=1;i<n;i++){
    53             cin>>s1>>s2;
    54             if(!m[s1]) m[s1]=id++;
    55             if(!m[s2]) m[s2]=id++;
    56             add(m[s2],m[s1]);
    57         }
    58         dfs(1);
    59         int ans,flag=1;
    60         if(d[1][1]>d[1][0]){
    61             ans=d[1][1];
    62             if(f[1][1]) flag=1;
    63             else flag=0;
    64         }
    65         else if(d[1][1]<d[1][0]){
    66             ans=d[1][0];
    67             if(f[1][0]) flag=1;
    68             else flag=0;
    69         }
    70         else ans=d[1][1],flag=0;
    71         printf("%d %s
    ",ans,flag?"Yes":"No");
    72     }
    73 }
    View Code
  • 相关阅读:
    IntelliJ Idea使用代码折叠
    c# 文件属性读取操作及文件之间操作
    c#文件操作
    c++头文件 #include<iostream>
    基本SQL语句
    dd
    c#属性中的get和set属性
    c#
    c#运算表达式
    c#方法
  • 原文地址:https://www.cnblogs.com/yijiull/p/7414041.html
Copyright © 2011-2022 走看看