求助上周 Atcoder D 题
  • 板块题目总版
  • 楼主封禁用户
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/12/19 13:05
  • 上次更新2023/10/24 07:13:31
查看原帖
求助上周 Atcoder D 题
639563
封禁用户楼主2022/12/19 13:05

RT,思路没错,感觉像是二分图的代码错了

话说好久没敲代码了,连二分图判定都不会敲了(

WA 了 28 个点

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

int fa[200005];

void init() {
	memset(fa, -1, sizeof fa);
}

int find_root(int x) {
	return ((fa[x] == -1) ? (x) : (fa[x] = find_root(fa[x])));
}

void unite(int x, int y) {
	int x_root = find_root(x);
	int y_root = find_root(y);
	if (x_root == -1 || x_root != y_root) {
		fa[x_root] = y_root;
	}
}

bool bipartite = 1;

vector<int> graph[200005];
int vis[200005];
long long white[200005], black[200005];
long long element[200005];

bool dfs(int x, int co) {
	if (vis[x] != -1) {
		return 1;
	}
	vis[x] = !co;
	for (int adj : graph[x]) {
		if (adj == !co) {
			bipartite = 0;
			return 0;
		}
		dfs(adj, !co);
	}
	return 1;
}

int main() {
	init();
	memset(vis, -1, sizeof vis);
	int n, m;
	scanf("%d %d", &n, &m);
	for (int i = 0; i < m; i++) {
		int a, b;
		scanf("%d %d", &a, &b);
		a--, b--;
		graph[a].push_back(b);
		graph[b].push_back(a);
		unite(a, b);
	}
	for (int i = 0; i < n; i++) {
		if (vis[i] == -1 && !dfs(i, 0)) {
			puts("0");
			return 0;
		}
	}
	for (int i = 0; i < n; i++) {
		element[find_root(i)]++;
		if (vis[i] == 0) {
			white[find_root(i)]++;
		} else {
			black[find_root(i)]++;
		}
	}
	long long ans = 0;
	for (int i = 0; i < n; i++) {
		ans += 1ll * element[i] * (n - element[i]);
	}
	for (int i = 0; i < n; i++) {
		ans += 1ll * white[i] * black[i];
	}
	ans -= m;
	printf("%lld", ans);
	return 0;
}
2022/12/19 13:05
加载中...