AcWing 860. 染色法判定二分图
原题链接
简单
作者:
郡呈
,
2019-08-12 15:24:48
,
所有人可见
,
阅读 2848
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5+10, M = 2*N;
int n, m;
int h[N], e[M], ne[M], idx, color[N];
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
bool dfs(int u, int c) {
color[u] = c;
for(int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if(!color[j]) {
if(!dfs(j, 3 - c)) return false;
} else if(color[j] == c) return false;
}
return true;
}
int main() {
cin >> n >> m;
int u, v;
memset(h, -1, sizeof h);
while(m--) {
cin >> u >> v;
add(u, v), add(v, u);
}
bool flag = true;
for(int i = 1; i <= n; i++) {
if(!color[i]) {
if(!dfs(i, 1)) {
flag = false;
break;
}
}
}
if(!flag) puts("No");
else puts("Yes");
return 0;
}
很详细,但是DFS这里还是有些懵逼,请教大佬
为什么未染色则直接染成1呢,为什么这样能保证正确性啊
因为二分图未必是联通的
大佬,请问二分图可以出现孤立点吗,好像用染色法可以有孤立的点
dalao能看看是哪里有问题吗?
#include[HTML_REMOVED]
#include[HTML_REMOVED]
using namespace std;
const int N=1e5+10;//点的个数
const int M=2e5+10;//边的个数
int n,m;
int e[M],ne[N],h[N],idx;
bool color[N];
void add(int a,int b)
{
e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
bool dfs(int u,int c)
{
color[u]=c;
for(int i=h[u];i!=-1;i=ne[i]) { int j=e[i]; if(!color[j]) { if(!dfs(j,3-c))return false; } else if(color[j]==c)return false; } return true;
}
int main()
{
cin>>n>>m; memset(h,-1,sizeof h); for(int i=0;i<m;i++) { int a,b;cin>>a>>b; add(a,b);add(b,a); } bool flag=true; for(int i=1;i<=n;i++) { if(!color[i]) { if(!dfs(i,1)) { flag=false; break; } } } if (!flag)cout<<"No"<<endl; else cout<<"Yes"<<endl;
}
orz解释的很详细!!!
奈斯
写的很清晰,点赞
有帮助就好hh