codeforces 1228D - Complete Tripartite

Posted newstartcy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 1228D - Complete Tripartite相关的知识,希望对你有一定的参考价值。

// 三点分图,还是挺简单的,讲下思路:先把所有的点分为3个集合,
//judge下集合不能为空,集合内的点不能有连线,最后judge下边数
#include<bits./stdc++.h>
using namespace std;
typedef long long i64;
const int maxn = 1e5 + 32;
int n,m,u,v,col[maxn];
set<int> Grape[maxn];
i64 arr[8];
int main()

    ios::sync_with_stdio(false);    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=0;i!=m;++i)
    
        cin>>u>>v;
        Grape[u].insert(v);
        Grape[v].insert(u);
    
    col[1] = 1;
    for(int i=2;i<=n;++i)
        if(!Grape[1].count(i))
            col[i] = 1;
    for(int i=2;i<=n;++i)
        if(!col[i])//如果节点i未被访问
        
            col[i] = 2;//寻找一个集合2
            for(int j=1;j<=n;++j)
            
                if(!Grape[i].count(j))
                
                    if(col[j]==1)
                    
                        cout<<-1<<‘\n‘;
                        return 0;
                    
                    col[j] = 2;
                
            
            break;
        //2号标记
    for(int i=1;i<=n;++i)
        if(!col[i])
            col[i] = 3;
    for(int i=1;i<=n;++i)
    
        for(auto v :Grape[i])
            if(col[v] == col[i])
            
                cout<<-1<<‘\n‘;
                return 0;
            
    //集合内的边去重
    for(int i=1;i<=n;++i)
        ++arr[col[i]];
    if(!arr[1]||!arr[2]||!arr[3])
        cout<<"-1"<<‘\n‘;
    else if((arr[1]*arr[2]+arr[1]*arr[3]+arr[2]*arr[3])!=m)
        cout<<-1<<"\n";
    else
        for(int i=1;i<=n;++i)
            cout<<col[i]<<" ";
        cout<<‘\n‘;
    

  

以上是关于codeforces 1228D - Complete Tripartite的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 1228D (暴力+思维+乱搞)

CF1228D Complete Tripartite

CF1228D Complete Tripartite

c_cpp 最小窗口子串。给定一个字符串S和一个字符串T,找到S中的最小窗口,它将包含在Comple中的T中的所有字符

iOS 后台任务

20160929训练记录