AT2376 [AGC014D] Black and White Tree

https://www.luogu.com.cn/problem/AT2376

先考虑叶子结点,发现,如果叶子结点的父亲是白点,那么叶子结点必须是黑点,

然后这一对点就可以删掉了

dfs跑一遍即可
code:

#include<bits/stdc++.h>
#define N 400050
using namespace std;
struct edge {
    int v, nxt;
} e[N << 1];
int p[N], eid;
void init() {
    memset(p, -1, sizeof p);
    eid = 0;
}
void insert(int u, int v) {
    e[eid].v = v;
    e[eid].nxt = p[u];
    p[u] = eid ++;
}
int n, vis[N];
void dfs(int u, int fa) {
    for(int i = p[u]; i + 1; i = e[i].nxt) {
        int v = e[i].v;
        if(v == fa) continue;
        dfs(v, u);
    }
    if(!vis[u]) {
        if(vis[fa]) {
            printf("First");
            exit(0);
        }
        vis[u] = vis[fa] = 1;
    }
}
int main() {
    init();
    scanf("%d", &n);
    for(int i = 1; i < n; i ++) {
        int u, v;
        scanf("%d%d", &u, &v);
        insert(u, v), insert(v, u);
    } vis[0] = 1;
    dfs(1, 0);
    printf("Second");
    return 0;
}
posted @ 2021-09-13 21:32  lahlah  阅读(159)  评论(0编辑  收藏  举报