UVA 1220(p282)----Party at Hali-Bula
2016-02-25 23:54
309 查看
#include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; const int maxn=250; int n; char st1[110],st2[110]; vector<string> name; vector<int> son[maxn]; int d[maxn][3],f[maxn][3]; int ID(const string& st) { for(int i=0; i<name.size(); i++) if(name[i]==st) return i; name.push_back(st); return name.size()-1; } int solve(int u,int k) { d[u][k]=k; f[u][k]=1; int num=son[u].size(); for(int i=0; i<num; i++) { int v=son[u][i]; if(k==1) { d[u][1]+=solve(v,0); if(!f[v][0]) f[u][1]=0; } else { int tmp1=solve(v,0); int tmp2=solve(v,1); d[u][0]+=max(tmp1,tmp2); if(d[v][0]==d[v][1]) f[u][0]=0; else if(d[v][0]>d[v][1]&&(!f[v][0])) f[u][0]=0; else if(d[v][0]<d[v][1]&&(!f[v][1])) f[u][0]=0; } } return d[u][k]; } void init() { name.clear(); for(int i=0; i<=n; i++) son[i].clear(); memset(f,0,sizeof(f)); memset(d,0,sizeof(d)); } #define debu int main() { #ifdef debug freopen("in.in","r",stdin); #endif // debug while(scanf("%d",&n)==1&&n) { init(); scanf("%s",st1); ID(st1); for(int i=0; i<n-1; i++) { scanf("%s %s",st1,st2); int x=ID(st1); int y=ID(st2); son[y].push_back(x); } printf("%d ",max(solve(0,0),solve(0,1))); bool flag=0; if(d[0][0]>d[0][1]&&f[0][0]) flag=1; if(d[0][0]<d[0][1]&&f[0][1]) flag=1; if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- 2016/2/25 onchange 应用
- 对于灰度图像中同一个像素,MATLAB和Photoshop的灰度值不同
- NIST and Quantum Computers
- jQuery源码分析系列
- SQL Server 之 Merge 与 using
- 使用canvas.clipPath来裁剪时部分机型出现问题
- Android之SurfaceView学习(一)
- leetcode-144-Binary Tree Preorder Traversal
- Dandelion - Eclipse Lisp Plugin
- Java连接Redis
- linux(ubuntu)2台互相ssh无密码访问
- 18. 4Sum
- 第五天 App编程开发【跟着大磨马学IT编程(安卓java)】
- Dash 安装 IOS文档 Apple 开发者离线文档下载
- Mac OS X Yosemite 10.10.5使用Toolbox安装Docker
- 安卓webView实现长按二维码的自动识别功能
- Android布局优化 merge标签使用
- Android工具类——LogUtil
- python的相对路径导入问题
- 一个好汉三个帮