UVA-1220 Party at Hali-Bula

来源:互联网 发布:细说php第2版pdf 编辑:程序博客网 时间:2024/06/06 21:46

Brief  description 

Algorithm  analyse

最大独立集的基础上加上一个判断唯一化。
思路紫书写得很好了。
重点是学习思维方式。

Code

#include <iostream>  #include <map>  #include <algorithm>  #include <cstdio>  #include <cstring>  #include <cstdlib>  #include <vector>  #include <queue>  #include <stack>  #include <functional>  #include <set>  #include <cmath>  using namespace std;  #define pb push_back  #define PB pop_back  #define bk back()  #define fs first  #define se second  #define sq(x) (x)*(x)  #define eps (1e-10)  #define INF (0x3f3f3f3f)  #define clr(x) memset((x),0,sizeof (x))  #define cp(a,b) memcpy((a),(b),sizeof (b))    typedef long long ll;  typedef unsigned long long ull;  typedef pair<int,int> P;  const int maxn=205;map<string,int>  emp;set<string>      s;         int fa[maxn];int vis[maxn];int d[maxn][2],f[maxn][2];int T;void init(){emp.clear();s.clear();clr(vis);clr(d);for(int i=0;i<maxn;i++)for(int j=0;j<2;j++)f[i][j]=1;}void dfs(int t){vis[t]=1;for(int i=0;i<T;i++){if(!vis[i]&&fa[i]==t){dfs(i);d[t][1]+=d[i][0];if(f[t][1]!=0)  f[t][1]=f[i][0];d[t][0]+=max(d[i][0],d[i][1]);if(d[i][0]==d[i][1]) f[t][0]=0;if(d[t][0]==d[i][1]&&f[i][1]==0) f[t][0]=0;if(d[t][0]==d[i][0]&&f[i][0]==0) f[t][0]=0;}}d[t][1]+=1;}int main(){while(scanf("%d",&T)&&T){init();string boss;cin>>boss;emp[boss]=0;s.insert(boss);int ans=1;for(int i=1;i<=T-1;i++){string a,b;cin>>a>>b;if(!s.count(a)){s.insert(a);emp[a]=ans++;}if(!s.count(b)){s.insert(b);emp[b]=ans++;}fa[emp[a]]=emp[b]; }dfs(0);if(d[0][0]>d[0][1]){if(f[0][0])printf("%d Yes\n",d[0][0]);elseprintf("%d No\n",d[0][0]);}else if(d[0][0]==d[0][1]){printf("%d No\n",d[0][0]);}else{if(f[0][1])printf("%d Yes\n",d[0][1]);elseprintf("%d No\n",d[0][1]);}}return 0;}


0 0
原创粉丝点击