Luogu P1330 封锁阳光大学

Posted bljfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1330 封锁阳光大学相关的知识,希望对你有一定的参考价值。

解题思路

显然相邻的两个点是不能够同时存在河蟹的,那就对每两个相邻的点进行染色操作,一个染成黑点,一个染成白点。一个很容易想到的事实就是如果在染色的过程中对某一点的操作和之前染的色冲突,那么河蟹就无法成功阻拦老曹刷街

 

附上代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

using namespace std;

const int maxn = 2e5+3;
int n, m, fir[maxn], nx[maxn], u[maxn], v[maxn];
int col[maxn], cnt, sum[4], Ans;
bool vis[maxn];
struct node {
    int n1, n2, x, tot, c;
}tmp;
queue<node> Q;
inline void addedge(int fr, int to) {
    nx[++cnt] = fir[fr];
    u[cnt] = fr, v[cnt] = to;
    fir[fr] = cnt;
}
inline bool dfs(int s, int color) {
    if(vis[s]) {
        if(color == col[s]) return true;
        else return false;
    }
    vis[s] = true;
    col[s] = color;
    sum[col[s]] ++;
    int k = fir[s];
    bool fin = true;
    while(k != -1) {
        fin = fin && dfs(v[k], col[s] ? 0 : 1);
        k = nx[k];
    }
    return fin;
}

int main() {
    scanf("%d%d", &n, &m);
    memset(fir, -1, sizeof(fir));
    int x, y;
    for(int i=1; i<=m; i++) {
        scanf("%d%d", &x, &y);
        addedge(x, y), addedge(y, x);
    }
    for(int i=1; i<=n; i++) {
        if(vis[i]) continue;
        sum[0] = sum[1] = 0;
        if(!dfs(i, 0)) {
            printf("Impossible
");
            return 0;
        }
        Ans += min(sum[1], sum[0]);
    }
    printf("%d", Ans);
}

 

以上是关于Luogu P1330 封锁阳光大学的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1330 封锁阳光大学--图上染色

luogu P1330 封锁阳光大学

Luogu P1330 封锁阳光大学 (黑白染色)

luogu P1330 封锁阳光大学

洛谷——P1330 封锁阳光大学

Luogu P1330 封锁阳光大学Dfs By cellur925