您的位置:首页 > 其它

UVA-1220 Party at Hali-Bula

2015-12-08 00:19 323 查看
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]);
else
printf("%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]);
else
printf("%d No\n",d[0][1]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: