D - Complete Tripartite
2024-08-27 18:15:10
三分图染色
链接:https://codeforces.com/contest/1228/problem/D
三分图染色步骤:First 首先找一个点1作为集合A中的点,再找到与1相连的一个点设为2,作为集合2中的首元素,再找到与1和2相连的一个点作为集合三的元素。
Second 枚举每一个点,判断该点是否同时与原先定义的三个点其中的两个相连,如果不相连则退出,输出-1。
Third,判断当前的点构成的边,与总边数是否相等,如果不相等则输出-1
Fourth 判断自己集合中的点时候有边;
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
vector<int >ve[N];
int arr[N];
int cnt[N];
int main(){
int n,m;
cin>>n>>m;
for(int i=;i<=m;i++) {
int x,y;
cin>>x>>y;
ve[x].push_back(y);
ve[y].push_back(x);
}
int first=;
arr[first]=; if(ve[first].size()==) {
cout<<-<<endl;
return ;
}
int second=ve[first][];
arr[second]=;
int third=;
for(int i=;i<=n;i++){
bool flag1=false ,flag2=false ;
if(i==second||i==first) continue ;
for(int j=;j<ve[i].size();j++){
if(ve[i][j]==first) flag1=true;
if(ve[i][j]==second) flag2=true;
}
if(flag1&&flag2){
third=i;
arr[i]=;
break;
}
}
if(third==){
cout<<-<<endl;
return ;
}
for(int i=;i<=n;i++){
if(i==first||i==second||i==third) continue ;
int flag1=,flag2=,flag3=;
for(int j=;j<ve[i].size();j++){
if(ve[i][j]==first) flag1=;
if(ve[i][j]==second) flag2=;
if(ve[i][j]==third) flag3=;
}
if(flag1+flag2+flag3!=) {
cout<<-<<endl;
return ;
}
if(flag1&&flag2) arr[i]=;
if(flag1&&flag3) arr[i]=;
if(flag2&&flag3) arr[i]=;
}
for(int i = ; i <= n; i ++) cnt[arr[i]] ++;//判断每个颜色一共有个点
if(cnt[]*cnt[] + cnt[]*cnt[] + cnt[]*cnt[] != m) {//每两种颜色都可以产生一条边
cout << - << endl;
return ;
}
for(int i=;i<=n;i++){
for(int j=;j<ve[i].size();j++){
if(arr[i]==arr[ve[i][j]]) {
cout<<-<<endl;
return ;
}
}
}
for(int i=;i<=n;i++) cout<<arr[i]<<" ";
cout<<endl;
return ;
}
最新文章
- ajax+php+js实现异步刷新表单验证
- js写的5秒钟倒计时跳转
- C#图像处理
- 学习django之正则表达式re模块
- 【POJ 2482】Stars in Your Window
- 十四、Java基础---------String、StringBuffer、StringBuilder基本应用
- Spring AOP 实现原理
- 声明了包的类Java命令找不到或无法加载主类
- 351. Android Unlock Patterns
- C# 无边框窗体移动代码
- express创建网站
- iOS中单例需要注意的
- Python爬虫入门:爬虫基础了解
- STM32基础问题分析——PWM配置
- javascript 回到顶部 动画效果
- gstreamer在Ubuntu下构建开发环境
- ccd引脚
- 1070. Mooncake (25)
- 洛谷P3388 【模板】割点(割顶)(tarjan求割点)
- spring 大会的启示