zoukankan      html  css  js  c++  java
  • [CF1228D] Complete Tripartite

    给定一张图,判定它是否是完全三分图。

    Solution

    考虑到最终划分到同一集合中的点,它们的直接可达点都是相同的

    于是我们记录每个点的直接可达点集合,排序,然后分段

    如果不是三段,则不存在

    同时要预先筛去有孤立点的情况

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    
    struct item {
        basic_string <int> str;
        int id;
    
        bool operator < (const item &b) const {
            return str < b.str;
        }
    } a[N];
    
    int n,m,t1,t2,t3,c[N],d[N];
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>m;
        for(int i=1;i<=m;i++) {
            cin>>t1>>t2;
            a[t1].str+=t2;
            a[t2].str+=t1;
        }
        for(int i=1;i<=n;i++) {
            a[i].id=i;
            sort(a[i].str.begin(),a[i].str.end());
        }
        sort(a+1,a+n+1);
        if(a[1].str.length()==1) {
            cout<<-1;
            return 0;
        }
        for(int i=1;i<=n;i++) {
            if(a[i].str==a[i-1].str) {
                c[i]=c[i-1];
            }
            else {
                c[i]=c[i-1]+1;
            }
        }
        if(c[n]!=3) {
            cout<<-1;
            return 0;
        }
        for(int i=1;i<=n;i++) if(c[i]==0) {cout<<-1; return 0;}
        for(int i=1;i<=n;i++) d[a[i].id]=c[i];
        for(int i=1;i<=n;i++) cout<<d[i]<<" ";
    }
    
    
  • 相关阅读:
    省选测试13
    省选测试12
    省选测试11
    省选测试9
    省选测试10
    省选测试8
    省选测试7
    省选测试6
    倍增 LCA && ST表
    博客园markdown
  • 原文地址:https://www.cnblogs.com/mollnn/p/12566346.html
Copyright © 2011-2022 走看看