• luogu_P1330 封锁阳光大学


    https://www.luogu.org/problem/P1330

    曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。

    阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。

    询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。


    如果一个点选白,那么与他相连的点必须是黑

    同一个联通快中,黑白可以互换

    如果遍历到冲突了,就直接impossible

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    #define ri register int
    #define u int
    #define NN 10005
    #define MM 100005
    
    namespace fast {
        inline u in() {
            u x(0);
            char s=getchar();
            while(s<'0'||s>'9') {
                s=getchar();
            }
            while(s>='0'&&s<='9') {
                x=(x<<1)+(x<<3)+s-'0';
                s=getchar();
            }
            return x;
        }
    }
    
    using fast::in;
    
    namespace all {
        u cnt,ans,n,N,M,h[NN];
        struct node {
            u to,next;
        } a[MM<<1];
        inline void add(const u &x,const u &y) {
            a[++cnt].next=h[x],a[cnt].to=y,h[x]=cnt;
        }
    
        u vt[NN],co[NN];
    
        u dfs(const u &x,const u &k,const u &deep) {
            if(vt[x]) {
                if(co[x]^k) return 0;
                else return 1;
            }
            vt[x]=1,++n,co[x]=k,ans+=k;
            if(deep==N) return 1;
            for(ri i(h[x]); i; i=a[i].next) {
                u _y(a[i].to);
                if(!dfs(_y,k^1,deep+1)) return 0;
            }
            return 1;
        }
    
        inline void solve() {
            N=in(),M=in();
            for(ri i(1); i<=M; ++i) {
                u _a(in()),_b(in());
                add(_a,_b),add(_b,_a);
            }
            u as(0);
            for(ri i(1); i<=N; ++i) {
                ans=n=0;
                if(!vt[i]&&!dfs(i,1,1)){
                    printf("Impossible");
                    return;
                }
                as+=std::min(ans,n-ans);
            }
            printf("%d",as);
        }
    }
    
    int main() {
        //freopen("x.txt","r",stdin);
        all::solve();
    }
  • 相关阅读:
    Debugger and device times have drifted by more than 60s. Please correct this by running adb shell "date `date +%m%d%H%M%Y.%S`" on your debugger machine.
    react native 动画组件Animated
    react-navigation 报错解决方法
    Java并发编程:线程池的使用
    如何设置eclipse下查看java源码
    接口和抽象类
    java接口可以继承多个接口
    抽象类和抽象方法的区别
    final
    static
  • 原文地址:https://www.cnblogs.com/ling-zhi/p/11620819.html
Copyright © 2020-2023  润新知