Algoritmo: bipartito gráfico máximo conjunto independiente

Máximo conjunto independiente grafo bipartito, sino también un problema muy clásico de un grafo bipartito.

ejemplo

ejemplos originales

Título Descripción
Dado un gráfico bipartito, representan cada uno un número de nodos n, m, lado es e, el número máximo de buscar a juego gráfico bipartito.

El formato de entrada
de la primera fila, n, m, p.
En segundo lugar a (e + 1) líneas de dos números enteros positivos u, v, representa u, v tener una ventaja incluso.

Formato de salida

La primera fila, punto bipartito gráfico máximo conjunto independiente.
La segunda línea, entre el punto de izquierda establecido independientemente de la salida del esquema de diversidad más grande, el elemento por elemento separado por un espacio.
La tercera línea, entre el punto derecho establecido independientemente de la salida del esquema de diversidad más grande, el elemento por elemento separado por un espacio.

entrada y salida de la muestra

entrada

4 4 7
1 1
1 3
2 2
2 3
2 4
3 2
4 2

exportación

5
3 4
1 3 4

Descripción / Tips
1 <= n, m <= 1,000, 1 <= e <= n * m.

gráfico máximo bipartito conjunto independiente

Permítanme hablar de lo que es el mayor conjunto independiente de grafos bipartitos: es decir, como muchos bipartita gráfico seleccionado punto, sino que tienen que asegurarse de que no hay ningún borde entre dos puntos seleccionados. Por ejemplo, como se muestra a continuación.

Aquí Insertar imagen Descripción

Punto rojo es el mayor punto centralizado independiente, podemos ver que estos puntos no están conectados entre dos lados.

De hecho, el mayor conjunto independiente de los puntos es que todos los puntos cubiertos lanzó punto mínimo, entonces esta es la razón?

Debido a que el punto de la cobertura de punto mínimo cubre todos los bordes, es decir, cualquier uno de los bordes tiene un punto en el que cubre el punto mínimo, siempre y cuando estos puntos aún por delante, cada lado sólo tendrá un punto final, y, naturalmente, es independiente configurado, sino porque la cubierta se elimina el punto mínimo, es el mayor conjunto independiente naturales hacia arriba.

Para concluir: = máximo conjunto independiente de todos los puntos - Vertex Cover mínimo

La palabra de código con el código de punto mínimo que cubre casi la misma, sobre la misma complejidad de tiempo: O (n * m).

código

# include <cstdio>
# include <algorithm>
# include <cmath>
# include <cstring>
# include <vector>

using namespace std;

const int N_MAX = 1000, E_MAX = 1000000;

struct Edge
{
    int to, next;
};

int n, m, e;
vector <int> g[N_MAX + 10];

int opp[N_MAX + 10];
bool vis[N_MAX + 10];

bool vx[N_MAX + 10], vy[N_MAX + 10];

void addEdge(int x, int y)
{
    g[x].push_back(y);
}

bool find(int x)
{
    if (vis[x]) return false;
    vis[x] = true;
    for (int i = 0; i < (int) g[x].size(); i++) {
        int y = g[x][i];
        if (opp[y] == 0 || find(opp[y])) {
            opp[y] = x;
            return true;
        }
    }
    return false;
}

void mark(int x)
{
    if (vx[x]) return;
    vx[x] = true;
    for (int i = 0; i < (int) g[x].size(); i++) {
        int y = g[x][i];
        if (opp[y] && !vy[y]) {
            vy[y] = true;
            mark(opp[y]);
        }
    }
}

int hungary()
{
    memset(opp, 0, sizeof(opp));
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        memset(vis, false, sizeof(vis));
        ans += find(i);
    }
    return ans;
}

int maxIndSet()
{
    int ans = hungary();
    memset(vis, false, sizeof(vis));
    for (int i = 1; i <= m; i++)
        vis[opp[i]] = true;
    memset(vx, false, sizeof(vx));
    memset(vy, false, sizeof(vy));
    for (int i = 1; i <= n; i++)
        if (!vis[i]) mark(i);
    return n + m - ans;
}

int main()
{
    scanf("%d%d%d", &n, &m, &e);
    for (int i = 1; i <= e; i++) {
        int x, y;
        scanf("%d%d", &x, &y);
        addEdge(x, y);
    }
    printf("%d\n", maxIndSet());
    for (int i = 1; i <= n; i++)
        if (vx[i]) printf("%d ", i);
    puts("");
    for (int i = 1; i <= m; i++)
        if (!vy[i]) printf("%d ", i);
    puts("");
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/000zwx000/p/12516388.html
Recomendado
Clasificación