Uva-1220 Party at Hali-Bula

来源:互联网 发布:早岁那知世事艰 编辑:程序博客网 时间:2024/06/06 09:53

题目链接:Party at Hali-Bula

题目大意:给一棵树,父节点和其子结点不能同时染色,问最多可以选取多少个结点染色,如果解唯一则输出Yes否则输出No。

解题思路:树形DP,dp[i][0]表示标号为i的节点不染色的最大选取值,dp[i][1]则是染色时的情况。更新的时候再判断一下唯一性:

1.dp[v][0] == dp[v][1]子节点是否染色都一样,则dp[u][0]不唯一。
2.子节点必须(不)染色,且此自最优解不唯一,则dp[u][0]不唯一。

代码如下:

#include <map>#include <set>#include <cmath>#include <queue>#include <stack>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;typedef pair<int, int> P;const int inf  = 0x3f3f3f3f;const int maxn = 2e4 + 15;bool Yuitsu, foo[205][2];int n, dp[205][2];vector<int> chd[205];map<string, int> ha;void DFS(int u){    if(dp[u][0] != -1 && dp[u][0] != -1) return;    if(!chd[u].size()){        dp[u][0] = 0; dp[u][1] = 1;         return;    }    dp[u][1] = 1; dp[u][0] = 0;    for(int i = 0; i < chd[u].size(); i++){        int v = chd[u][i];        DFS(v);         dp[u][1] += dp[v][0];          if(foo[v][0]) foo[u][1] = true;        dp[u][0] += max(dp[v][0], dp[v][1]);        if(dp[v][0] == dp[v][1]) foo[u][0] = true;        if(dp[v][0] > dp[v][1] && foo[v][0]) foo[u][0] = true;        if(dp[v][1] > dp[v][0] && foo[v][1]) foo[u][0] = true;    }    return;}int main(){#ifdef NEKO    freopen("Nya.txt", "r", stdin);#endif    ios::sync_with_stdio(false);  cin.tie(0);    string l, r;    while(cin >> n && n){        for(int i = 0; i <= n; i++) chd[i].clear();        memset(dp, -1, sizeof dp); ha.clear();        memset(foo, false, sizeof foo);        cin >> l; ha[l] = 0; Yuitsu = true;        for(int i = 1; i < n; i++){            cin >> l >> r;            if(!ha.count(l)) ha.insert({ l, ha.size() });            if(!ha.count(r)) ha.insert({ r, ha.size() });            chd[ha[r]].push_back(ha[l]);        }        DFS(0);        if(dp[0][1] == dp[0][0]) Yuitsu = false;        if(dp[0][1] > dp[0][0] && foo[0][1]) Yuitsu = false;        if(dp[0][1] < dp[0][0] && foo[0][0]) Yuitsu = false;        int ans = max(dp[0][1], dp[0][0]);        cout << ans << ' ' << (Yuitsu == true ? "Yes" : "No") << endl;    }    return 0;}
0 0
原创粉丝点击