zoukankan      html  css  js  c++  java
  • [POI2010] GIL-Guilds

    给一张无向图,要求你用黑白灰给点染色,且满足对于任意一个黑点,至少有一个白点和他相邻;对于任意一个白点,至少有一个黑点与他相邻,对于任意一个灰点,至少同时有一个黑点和白点和灰点与他相邻,问能否成功

    Solution

    显然灰色是多余的

    首先考虑什么样的情况是不行的,显然仅在有孤立点的时候会挂,而连通图一定可以

    所以我们只需要拿起每个连通块 DFS 随便染即可

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1000005;
    vector <int> g[N];
    int n,m,a[N],vis[N],cnt;
    
    void dfs(int p) {
        ++cnt;
        vis[p]=1;
        for(auto q:g[p]) if(vis[q]==0) {
            a[q]=a[p]^1;
            dfs(q);
        }
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>m;
        for(int i=1;i<=m;i++) {
            int t1,t2;
            cin>>t1>>t2;
            g[t1].push_back(t2);
            g[t2].push_back(t1);
        }
        for(int i=1;i<=n;i++) {
            if(vis[i]==0) {
                cnt=0;
                dfs(i);
                if(cnt==1) {
                    cout<<"NIE";
                    return 0;
                }
            }
        }
        cout<<"TAK"<<endl;
        for(int i=1;i<=n;i++) cout<<(a[i]?'K':'S')<<endl;
    }
    
    
  • 相关阅读:
    时钟展频技术能有效降低EMI,深入讲解展频发生器!
    24:购物单
    22:按照字典输出字符串
    21:句子逆序
    20:字符反转
    19:ReverseNumber数字颠倒
    DNS原理及其解析过程
    18:字符个数统计
    17:不重复整数提取NoRepeatNum
    \s+ split替换
  • 原文地址:https://www.cnblogs.com/mollnn/p/12335444.html
Copyright © 2011-2022 走看看