HDU 2412 Party at Hali-Bula

来源:互联网 发布:php 考试开源系统源码 编辑:程序博客网 时间:2024/05/21 06:59

与HDU 1250类似,不同的是多了一个条件,即判定最大值的解是否唯一,主要说说判定唯一性的问题就行了。

HDU 1250题解:http://blog.csdn.net/wangjie_wang/article/details/9169799

若取当前点,则这时取最大值是否唯一就变成了判定不取儿子节点时是否有某个儿子节点的最大值是否唯一了。

若不取当前点,则分为三种情况:

1:最大值在不取儿子节点时获得,则这时判定就变成了此时儿子节点最大值是否唯一。

2:最大值在取儿子节点时获得,则这时判定也变成了此时儿子节点最大值是否唯一。

3:取或者不取儿子节点值相等时,最大值解必然不唯一。

 

#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <queue>#include <algorithm>#include <map>#include <vector>#include <stack>using namespace std;#define ll long long#define int64 __int64#define M 1000005#define N 10005#define inf 1<<30#define mod 1000000007struct node{int e;int next;}tree[N];struct data{int yes , no;int yfg , nfg;//分别为取此点的解是否为唯一和不取此点的解是否唯一}tp[N];int n , tot;int head[N];void Addedge(int s , int e){tree[tot].e = e;tree[tot].next = head[s];head[s] = tot++;}void Dfs(int s){tp[s].yes = 1;tp[s].no = 0;tp[s].nfg = tp[s].yfg = 0;int i;for (i = head[s] ; i != -1 ; i = tree[i].next){int e = tree[i].e;Dfs(e);tp[s].yes += tp[e].no;tp[s].no += max(tp[e].no,tp[e].yes);if (!tp[s].yfg && tp[e].nfg)tp[s].yfg =1; //三种情况if (tp[e].no > tp[e].yes){if (!tp[s].nfg && tp[e].nfg)tp[s].nfg = 1;}else if (tp[e].no < tp[e].yes){if (!tp[s].nfg && tp[e].yfg)tp[s].nfg = 1;}else{tp[s].nfg = 1;}}}int main(){int i , cnt;while (scanf("%d",&n) , n){string name , boss;map<string , int> sq;memset(head , -1 , sizeof head);tot = cnt = 1;cin >> boss;sq[boss] = cnt++;for (i = 1 ; i < n ; i++){cin >> name >> boss;if (sq[name] <= 0)sq[name] = cnt++;if (sq[boss] <= 0)sq[boss] = cnt++;Addedge(sq[boss] , sq[name]);}Dfs(1);if (tp[1].yes > tp[1].no){printf("%d ",tp[1].yes);if (!tp[1].yfg)printf("Yes\n");elseprintf("No\n");}else if (tp[1].yes < tp[1].no){printf("%d ",tp[1].no);if (!tp[1].nfg)printf("Yes\n");elseprintf("No\n");}else printf("%d No\n",tp[1].no);}return 0;}


 

原创粉丝点击