染色法判定二分图
染色法判定二分图
二分图:
1.当且仅当图中无奇数环
2.能且只能用两种颜色染色
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010, M = 200010;
int n, m;
int h[N], e[M], ne[M], idx;
int color[N];
//邻接表
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
bool dfs(int u, int c)//深度优先遍历,u是当前点下标,c是当前点染的颜色
{
color[u] = c;
for (int i = h[u]; i != -1; i = ne[i])//遍历与u相邻的所有点
{
int j = e[i];
if (!color[j])
{//如果没染色就染成与u的颜色不同的颜色并且如果dfs为false就返回false
if (!dfs(j, 3 - c)) return false;
}
else if (color[j] == c) return false;//如果染的颜色与u的颜色相同就返回false
}
return true;//剩余true
}
int main()
{
//邻接表存图
scanf("%d%d", &n, &m);
memset(h, -1, sizeof h);
while (m -- )
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b), add(b, a);//无向图-->双向存!
}
bool flag = true;//true是不矛盾
for (int i = 1; i <= n; i ++ )//n个顶点进行染色法
if (!color[i])
{//如果没有染色,就涂成1号色,如果dfs返回false说明就是有矛盾就flag=false退出循环
if (!dfs(i, 1))
{
flag = false;
break;
}
}
if (flag) puts("Yes");
else puts("No");
return 0;
}
我的代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
const int M=200010;
int h[N];//头指针
int idx;
int e[M];//当前点的值
int ne[M];//next指针
int n,m;//n个顶点,m条边
int color[N];//记录染的颜色
//邻接表建立图
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx;
idx++;
}
bool dfs(int i,int c){
color[i]=c;//记录当前染的颜色
for(int j=h[i];j!=-1;j=ne[j]){
int d=e[j];//取当前下标值
if(!color[d]){//如果没有染过颜色
if(!dfs(d,3-c)){
return false;
}
}
if(color[d]==c){//如果染的颜色与i点颜色相同
return false;
}
}
return true;
}
int main(){
memset(h,-1,sizeof h);
cin>>n>>m;
int a,b;
while(m--){
cin>>a>>b;
add(a,b);
add(b,a);
}
bool flag=true;
for(int i=1;i<=n;i++){
if(!color[i]){//如果没染色就将他染成1号色
if(!dfs(i,1)){
//如果dfs是false
flag=false;
break;
}
}
}
if(flag==true){
cout<<"Yes";
}
else{
cout<<"No";
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】