K Color Graph bipartite graph enumeration
Dirección de reproducción:
https://ac.nowcoder.com/acm/contest/4370
Tema:
Le da un gráfico simple, dejando la mayoría de los bordes, para que el gráfico resultante no contenga anillos impares.
Ideas basicas:
El gráfico no contiene anillos impares, es decir, si es un gráfico bipartito, enumere el estado de teñido de cada vértice del gráfico bipartito, y luego juzgue cada borde de acuerdo con la naturaleza básica del gráfico bipartito. Si el color de los dos puntos finales de este borde es diferente, entonces este borde Pertenecen al gráfico bipartito, el valor máximo del número máximo de bordes actualizado cada vez.
Código de referencia:
#include <bits/stdc++.h>
using namespace std;
#define IO std::ios::sync_with_stdio(false)
#define int long long
#define INF 0x3f3f3f3f
const int maxn = 20;
int vis[maxn];
int n,m;
vector<pair<int,int>> memo;
signed main() {
IO;
int t;
cin >> t;
for (int cas = 1; cas <= t; cas++) {
cin >> n >> m;
memo.clear();
memset(vis, 0, sizeof(vis));
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
memo.emplace_back(make_pair(u, v));
}
int ans = -1;
for (int i = 0; i < (1 << n); i++) {//枚举二分图染色状态;
for (int j = 1; j <= n; j++) {
if (i >> (j - 1) & 1) vis[j] = 1;
else vis[j] = 0;
}
int cnt = 0;
for (auto it : memo) {//判断每条条边是否属于二分图;
if (vis[it.first] != vis[it.second]) cnt++;
}
ans = max(ans, cnt);
}
cout << "Case #" << cas << ": " << ans << endl;
}
return 0;
}