AcWing 860. 染色法判定二分图(染色法)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 860. 染色法判定二分图(染色法)相关的知识,希望对你有一定的参考价值。

题目连接

https://www.acwing.com/problem/content/862/

思路

我们对每一个节点进行染色操作,我们需要注意的是我们染色后要将当前节点的所有相邻节点全部染成另一种颜色,如果出现颜色相同的情况,那么就说明产生了奇数边的环,也就说明不存在二分图

代码

代码一

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+10;
vector<int> V[N];
int vis[N];
int n,m;
bool fg;

bool dfs(int u,int c)
	vis[u] = c;
	for(int i = 0,l = V[u].size();i < l; ++i) 
		int v = V[u][i];
		if(c == vis[v]) return false;//染到相同颜色
		else if(!vis[v] && (!dfs(v,3-c))) return false;//如果下一个染色失败,则返回false
	
	return true;


int main()

	std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);
	cin>>n>>m;
	int u,v;
	for(int i = 1;i <= m; ++i) 
		cin>>u>>v;
		V[u].push_back(v),V[v].push_back(u);
	
	for(int i = 1;i <= n; ++i) 
		if(!vis[i] && (!dfs(i,1))) 
			cout<<"No"<<endl;
			return 0;
		
	
	cout<<"Yes"<<endl;
	return 0;

代码二

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+10;
vector<int> V[N];
int vis[N];
int n,m;
bool fg;

void dfs(int loc)
    if(!fg) return;
    for(int i = 0,l = V[loc].size();i < l; ++i) 
        int v = V[loc][i];
        if(vis[v] == vis[loc]) 
            fg = false;
            return;
        
        if(!vis[v])
            vis[v] = 3 - vis[loc];
            dfs(v);
        
    


int main()

    std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);
    cin>>n>>m;
    fg = true;
    int u,v;
    for(int i = 1;i <= m; ++i) 
        cin>>u>>v;
        V[u].push_back(v);
        V[v].push_back(u);
    
    for(int i = 1;i <= n; ++i) 
        if(!vis[i]) vis[i] = 1,dfs(i);
    
    
    if(fg) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;

以上是关于AcWing 860. 染色法判定二分图(染色法)的主要内容,如果未能解决你的问题,请参考以下文章

染色法判定二分图

染色法判定二分图

二分图的判定(染色法)和二分图最大匹配(匈牙利)算法及模板

hdu5285-wyh2000 and pupil-(染色法二分图判定)

模板:二分图染色+判定

图论 —— 二分图的判定及最大匹配