题意

https://vjudge.net/problem/CodeForces-1228D

有一个n个顶点m条边的无向图,在一对顶点中最多有一条边。

设v1,v2是两个不相交的非空子集,当满足以下条件时f(v1,v2)为真

  • v1中的点之间不存在边
  • v2中的点之间不存在边
  • 对于在v1v2中的每一对顶点,x在v1中,y在v2中,xy之间有边

所有点集不为空,且不相交,是否有v1,v2,v3使得f(v1,v2)、f(v2,v3)、f(v3,v1)均为真

如果有输出每个点所在的点集(1,2,3),否则输出-1

思路

这题比赛没敢开,其实就是个乱搞题,只不过细节很多。。

主要思路就是先随便选一个点插入第一个集合,然后和这个点直接相连的点肯定不能插入第一个集合,不相连的点插入第一个集合。再在不在第一个集合的点中随便选一个点,类似的扩展下去只不过要注意不能用集合1中的点,这样第二个集合就构造好了,剩余的点插入第三个集合,最后判断两两集合是否每个点都相连。这里用map<int,int> mp[N]判断是否相连比较舒服~

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
vector<int> g[N];
unordered_map<int,int> mp[N];
int q[N];
int main()
{
std::ios::sync_with_stdio(false);
int n,m,flag=0;
cin>>n>>m;
for(int i=1; i<=m; i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
mp[u][v]=mp[v][u]=1;
}
if(m==0)
{
cout<<-1<<endl;
return 0;
}
set<int> a,b,c;
map<int,int> t;
a.insert(1);
int sz=g[1].size(),bb;
if(sz==0)
{
cout<<-1<<endl;
return 0;
}
for(int i=1; i<=n; i++)
{
if(!mp[1][i])
a.insert(i);
else
bb=i;
}
if(a.size()==n)
{
cout<<-1<<endl;
return 0;
}
sz=g[bb].size();
if(sz==0)
{
cout<<-1<<endl;
return 0;
}
b.insert(bb);
for(int i=1; i<=n; i++)
{
if(!mp[bb][i]&&a.find(i)==a.end())
{
b.insert(i);
}
} for(int i=1; i<=n; i++)
{
if(a.find(i)==a.end()&&b.find(i)==b.end())
{
c.insert(i);
}
}
for(int i:a)
{
for(int j:b)
{
if(!mp[i][j])
{
flag=1;
break;
}
}
for(int j:c)
{
if(!mp[i][j])
{
flag=1;
break;
}
}
if(flag)
break;
}
for(int i:b)
{
for(int j:c)
{
if(!mp[i][j])
{
flag=1;
break;
}
}
}
if(a.size()+b.size()+c.size()!=n||
a.size()==0||b.size()==0||c.size()==0||a.size()*b.size()+a.size()*c.size()+b.size()*c.size()!=m)
flag=1; if(flag)
{
cout<<-1<<endl;
}
else
{ for(int i:a)
q[i]=1;
for(int i:b)
q[i]=2;
for(int i:c)
q[i]=3;
for(int i=1; i<=n; i++)
cout<<q[i]<<" ";
cout<<endl;
}
return 0;
}

  

最新文章

  1. vue2.0有哪些变化
  2. ButterKnife--View注入框架的使用
  3. .NET实现微博粉丝服务平台接口
  4. Constraint3:check约束 和 null
  5. js中对象使用
  6. web性能调优
  7. NoSQL-Redis【2】-实现分布式Session
  8. IOS启动顺序
  9. hdu 4635 Strongly connected(强连通)
  10. UVA 10006 - Carmichael Numbers 数论(快速幂取模 + 筛法求素数)
  11. HUST 1017 Exact cover (Dancing links)
  12. LabVIEW系列——生产现场故障邮件通知
  13. Java——(二)Java集合容器
  14. NuGet学习笔记(2)——使用图形化界面打包自己的类库(转)
  15. 解决win10系统以太网适配器的驱动程序可能出现问题
  16. 【Java框架型项目从入门到装逼】第十四节 查询用户列表展现到页面
  17. python学习笔记(4)
  18. June 4. 2018 Week 23rd Monday
  19. java课程课后作业05之动手动脑
  20. 查看windows下指定的端口是否开放

热门文章

  1. Java反射04 : 通过Array动态创建和访问Java数组
  2. P1005 Spell It Right
  3. Python升级PIP
  4. s3c2440裸机-UART编程(二、UART编程实现)
  5. 201871010114-李岩松《面向对象程序设计(java)》第十六周学习总结
  6. springmvc 什么时候 set applicationContext 到 ServletConfig 的?
  7. day95_11_28,selenium定位元素,cookies获取
  8. uva 10189 扫雷
  9. .NET Core NuGet 多项目套餐打包的正确姿势
  10. Hibernate 知识收纳.