【题目描述】
给定一个
n
n
n个点
m
m
m条边的无向图,图中可能存在重边和自环。
请你判断这个图是否是二分图。
【输入格式】
第一行包含两个整数
n
n
n和
m
m
m。
接下来
m
m
m行,每行包含两个整数
u
u
u和
v
v
v,表示点
u
u
u和点
v
v
v之间存在一条边。
【输出格式】
如果给定图是二分图,则输出Yes,否则输出No。
【数据范围】
1
≤
n
,
m
≤
1
0
5
1≤n,m≤10^5
1≤n,m≤105
【输入样例】
4 4 1 3 1 4 2 3 2 4
【输出样例】
Yes
#include#include #include using namespace std; const int N = 100010, M = 200010; int e[M], ne[M], h[N], idx; int n, m; int color[N];//color为0表示未染色,1和2表示两种不同的颜色 void add(int u, int v) { e[idx] = v, ne[idx] = h[u], h[u] = idx++; } bool dfs(int u, int c) { color[u] = c;//将当前点染色 for (int i = h[u]; ~i; i = ne[i])//遍历每条边 if (color[e[i]] == c) return false;//若下一个点颜色和当前点一样则冲突 else if (!color[e[i]])//如果下一个点未被染色 if (!dfs(e[i], 3 - c)) return false;//3 - c可实现1和2的互换 return true; } int main() { 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) puts("Yes"); else puts("No"); return 0; }



