El 2019 ICPC Asia Shanghai Regional Contest K Color Graph bipartite graph enumeration

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;
}
Publicado 23 artículos originales · elogiado 7 · visitas 1752

Supongo que te gusta

Origin blog.csdn.net/weixin_44164153/article/details/104418341
Recomendado
Clasificación