Complete Tripartite

D - Complete Tripartite

思路:这个题是个染色问题。理解题意就差不多写出来一半了。开始的时候还想用离散化来储存每个点的状态,即它连接的点有哪些,但很无奈,点太多了,long long范围内肯定存不完,于是想到用python来写,但是 py 也没有很熟练.....便放弃了。

需要注意的:

要统计总共有多少颜色,不然会漏掉只有两种颜色的情况,这种情况是输出-1的。还有前向星存边的时候记得开两倍。

代码:

// Created by CAD on 2019/10/2.
#include <bits/stdc++.h>
#define mst(name, value) memset(name,value,sizeof(name))
using namespace std;

const int maxn=3e5+5;
struct edge{
    int to,next;
}e[maxn<<1];
int cnt,head[maxn],color[maxn],vis[maxn],n,m,blo;

void add(int u,int v)
{
    e[++cnt].to=v;
    e[cnt].next=head[u];
    head[u]=cnt;
}
bool check(int x)
{
    if(++blo==4) return false;
    color[x]=blo;
    int num=0;
    for(int i=head[x];i;i=e[i].next)
        vis[e[i].to]=1,num++;
    for(int i=1;i<=n;++i)
    {
        if(i==x||vis[i])    continue;
        int cnt2=0;
        color[i]=blo;
        for(int j=head[i];j;j=e[j].next)
        {
            if(!vis[e[j].to]) return false;
            cnt2++;
        }
        if(cnt2!=num)   return false;
    }
    mst(vis,0);
    return true;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1,u,v;i<=m;++i)
        cin>>u>>v,add(u,v),add(v,u);
    for(int i=1;i<=n;++i)
        if(!color[i])
        if(!check(i))   return puts("-1");
    if(blo!=3)  return puts("-1");
    for(int i=1;i<n;++i)
        cout<<color[i]<<" ";
    cout<<color[n]<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/CADCADCAD/p/11617446.html

时间: 2024-11-03 18:28:02

Complete Tripartite的相关文章

Codeforces 1228D. Complete Tripartite

传送门 不妨设 $1$ 号点在集合 $1$ 里 那么对于其他点,有且只有所有和 $1$ 没有边的点都在集合 $1$ 里 考虑不在集合 $1$ 的任意一个点 $x$ ,不妨设它在集合 $2$ 里 那么所有不在集合 $1$ 的,和 $x$ 没有边的点都在集合 $2$ 里,剩下的点都一定在集合 $3$ 里 所以集合划分完毕,然后就是判断合法性了,特判当然是越多越好啦! #include<iostream> #include<cstdio> #include<algorithm>

Codeforces Round #589 (Div. 2)

目录 Contest Info Solutions A. Distinct Digits B. Filling the Grid C. Primes and Multiplication D. Complete Tripartite E. Another Filling the Grid Contest Info Practice Link Solved A B C D E F 5/6 O O O O ? - O 在比赛中通过 ? 赛后通过 ! 尝试了但是失败了 - 没有尝试 Solutions

Codeforces-Round#589 Div2

A题 Distinct Digits 题解: 暴力水题 1 #include<bits/stdc++.h> 2 using namespace std; 3 int f[10]; 4 bool judge(int x) 5 { 6 memset(f,0,sizeof(f)); 7 while(x){ 8 f[x%10]++; 9 if(f[x%10]>1)return false; 10 x/=10; 11 } 12 return true; 13 } 14 int main() 15

codeforces/contest/1228

B. Filling the Grid 分行和列进行染色,扫完图以后没有被染色的格子数,就是对答案产生的贡献值,wa了一发,因为没看清样例,会有冲突情况产生,这种情况下的答案是0 #include<bits/stdc++.h> const double pi=3.14159; typedef long long int ll; const int mod=1e9+7; int amap[1010][1010]; int hh[1010],ww[1010]; ll qpow(ll a,ll b)

Codeforces Round #589 (Div. 2) (e、f没写)

https://codeforces.com/contest/1228/problem/A A. Distinct Digits 超级简单嘻嘻,给你一个l和r然后寻找一个数,这个数要满足的条件是它的每一位的数字不相同,找出满足要求的最小的那个数输出,没有找到就输出-1: 1 #include<bits/stdc++.h> 2 using namespace std; 3 bool check(int n){ 4 int vis[15]={0}; 5 while(n){ 6 if(!vis[n%

ProToolMaker v9.0+Complete.v13.8

MapiPitney Bowes MapInfo Pro v12.0.0 Win32_64 1CD MSC.Adams.v2013.1.Win64 1DVD PGI.Visual.Fortran.v13.6.with.VS2010.Shell.win7.8.2008.r2.2012.X64 1DVD PGI.Visual.Fortran.v13.8.win7.8.2008.r2.2012.X64 1CD PGI.Visual.Fortran.v13.8.with.VS2010.Shell.win

[LeetCode] 222. Count Complete Tree Nodes Java

题目: Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from Wikipedia:In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as

Ajax之 beforeSend和complete longind制作

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; min-height: 18.0px } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #f9f9f5 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #888471 } p.p4 {

Count Complete Tree Nodes

Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from Wikipedia:In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as pos