POJ3342 Party at Hali-Bula(树形DP)
2016-06-13 08:55
344 查看
题目大意:
有n个人要一起聚会,规定直接上司不能和他的直接下属一起出席。问最多能去几人是唯一解吗?
题目思路:树形DP+链试前向星:
有n个人要一起聚会,规定直接上司不能和他的直接下属一起出席。问最多能去几人是唯一解吗?
题目思路:树形DP+链试前向星:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> int to1[210],begin1[210],next1[210],d[210][2],u[210][2],e; char s[210][210],a[210],b[210]; using namespace std; void add(int x,int y){//链试前向星 to1[e]=y; next1[e]=begin1[x]; begin1[x]=e++; } void dfs(int x){//搜索 int i; d[x][0]=0; d[x][1]=1; u[x][0]=1; u[x][1]=1; for(i=begin1[x];i!=-1;i=next1[i]){ int t=to1[i]; dfs(t); d[x][0]+=max(d[t][0],d[t][1]);//当不取时选下级选与不选的最小值 d[x][1]+=d[t][0];//当选时下级不能选 if(d[t][0]>d[t][1] &&d[t][0]==0)u[x][0]=0;//判断是不是唯一解 else if(d[t][1]>d[t][0] && d[t][1]==0)u[x][0]=0; else if(d[t][0]==d[t][1])u[x][0]=0; if(u[t][0]==0)u[x][1]=0; } } int main(void){ int i,j,k,m,n,sum,sum1; while(scanf("%d",&n)!=EOF&&n){ scanf("%s",s[1]); memset(begin1,-1,sizeof(begin1));//清空 e=0; k=1; for(i=1;i<n;i++){ scanf("%s%s",a,b);//输入 sum=sum1=-1; for(j=1;j<=k;j++){ if(strcmp(a,s[j])==0)sum=j; if(strcmp(b,s[j])==0)sum1=j; } if(sum==-1){//存入s k++; sum=k; strcpy(s[k],a); } if(sum1==-1){ k++; sum1=k; strcpy(s[k],b); } add(sum1,sum);//将它计入链试前向星 } memset(d,0,sizeof(d)); dfs(1); if(d[1][0]>d[1][1] &&u[1][0]==1)printf("%d Yes\n",d[1][0]); else if(d[1][1]>d[1][0] &&u[1][1]==1)printf("%d Yes\n",d[1][1]); else printf("%d No\n",max(d[1][1],d[1][0])); } return 0; }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe