poj 3342

来源:互联网 发布:配电计算软件注册 编辑:程序博客网 时间:2024/06/05 02:35
按照lrj思路实现的树上dp,病后第一题,明天继续
#include<cstdio>// 0 don't choose 1 choose #include<cstdlib>#include<cstring>#include<iostream>using namespace std;int i,n;char a[205][30],ch[205][30];int bo[205],d[205][5];bool f[205][5];int search(char *b){for(int j=0; j<n; j++){if(strcmp(b,a[j])==0){return j;}}return -2;}void dp(int i){if(d[i][1]>0) return;int j,v;for(j=1; j<n; j++){if(bo[j]==i){dp(j);if(d[j][0]>d[j][1])v=0;else if(d[j][1]>d[j][0]) v=1;else f[i][0]=1;d[i][0]+=max(d[j][0],d[j][1]);if(f[j][v]==1) f[i][0]=1;d[i][1]+=d[j][0];if(f[j][0]==1) f[i][1]=1;}}d[i][1]+=1;}int main(){int v;while(scanf("%d", &n) && n){memset(a,'\0',sizeof(a));memset(d,0,sizeof(d));memset(f,0,sizeof(f));cin>>a[0]; bo[0]=-1;for(i=1; i<n; i++) cin>>a[i]>>ch[i];for(i=1; i<n; i++) bo[i] = search(ch[i]);dp(0);cout<<max(d[0][0],d[0][1])<<' ';if(d[0][0]>d[0][1]) v=0;else if(d[0][1]>d[0][0]) v=1;else v=2;if(v==2||f[0][v]==1) cout<<"No"<<endl;else cout<<"Yes"<<endl;}return 0;} 

原创粉丝点击