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;
}