Game on a Tree Gym - 102392F(樹上最大匹配)


思路:

本質是求一個樹上的最大匹配能否覆蓋所有的點。

dfs遍歷,用qian[]數組記錄當前節點的子樹內有幾個沒有匹配的點(初始化為-1因為可以匹配掉一個子樹中未匹配的點),pipei[]數組記錄當前節點是否匹配。如果一個點u的子節點有未匹配的,那么u可以匹配掉一個點,但是有多個未匹配的點,就得累積在u上。也就是說如果qian[]數組>0,那么子樹中有未匹配的點,需要將該子樹的根u標記為未匹配狀態,使得u的父親fu能知道u中有未匹配的點,從而使fu可以匹配。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
vector<int>E[maxn];
bool pipei[maxn];
int qian[maxn];
void dfs(int u,int fu){
    qian[u]=-1;
    int cnt=0;
    for(auto v:E[u]){
        if(v==fu)continue;
        dfs(v,u);
        qian[u]+=max(qian[v],pipei[v]?0:1);
        if(!pipei[v])cnt++;
    }
    if(!cnt||qian[u]>0)pipei[u]=0;
    else pipei[u]=1;
    return;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        E[u].push_back(v);
        E[v].push_back(u);
    }
    dfs(1,0);
    if(qian[1]!=0){
        printf("Alice\n");
 
    }
    else printf("Bob\n");
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM