给定一个n个点m条边的无向图,图中可能存在重边和自环。
请你判断这个图是否是二分图。
这道题是模板啦,并且还有一个性质:
当且仅当图中不含奇数环时它是二分图.
这个时候染色原理就可以解决这个问题
O
(
m
+
n
)
O(m+n)
O(m+n)的时间复杂度
这里我们用
d
f
s
dfs
dfs进行染色
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10,M = 2 * N;
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)
{
color[u] = c;//将u染色为c
for(int i = h[u];i != -1;i = ne[i])
{
int j = e[i];
if(!color[j])//如果color未染色
{
if(!dfs(j,3-c))return false;//如果j染色后冲突
}
else if(color[j] == c)return false;//如果j和c的颜色冲突
}
return true;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
cin >> n >> m;
memset(h,-1,sizeof h);
while(m--)
{
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 <<"Yes\n";
else cout <<"No";
return 0;
}