POJ 1247 gráfico bipartito (para ser corregido)

The Perfect Stall
TimeLimit: 2000ms MemoryLimit: 65536k
64 bits número entero formato IO:% LLD
Descripción del problema
Farmer John completó su nuevo establo apenas la semana pasada, con la última tecnología de ordeño. Lamentablemente, debido a problemas de ingeniería, todos los puestos en el nuevo granero son diferentes. Durante la primera semana, Farmer John asignó al azar a las vacas a los puestos, pero rápidamente se hizo evidente que cualquier vaca que se dio fue sólo están dispuestos a producir leche en ciertos puestos. Durante la última semana, Farmer John ha estado recopilando datos en los que las vacas están dispuestos a producir leche en la que se ahogue. Un puesto puede ser solamente asignado a una vaca, y, por supuesto, una vaca puede ser solamente asignado a uno de la parada. Teniendo en cuenta las preferencias de las vacas, calcular el número máximo de tareas productoras de leche de vacas para puestos que es posible.
Entrada
La entrada incluye varios casos. Para cada caso, la primera línea contiene dos números enteros, N (0 <= N <= 200) y M (0 <= M <= 200). N es el número de vacas que tiene Farmer John y M es el número de puestos en el nuevo granero. Cada uno de los siguientes n líneas corresponde a una sola vaca. El primer número entero (Si) en la línea es el número de puestos de que la vaca está dispuesto a leche productos en (0 <= Si <= M). Los siguientes números enteros de Si en esa línea son los puestos en los que esa vaca está dispuesto a producir leche. Los números de parada serán números enteros en el intervalo (1 ... M), y no la parada se indican dos veces para una vaca dado.
Output
Para cada caso, la salida de una sola línea con un solo número entero, el número máximo de asignaciones de puesto productoras de leche que se pueden hacer.
SampleInput
5 5

2 2 5

3 2 3 4

2 1 5

3 1 2 5

1 2
SampleOutput
4

Significado de las preguntas: Hay n el número de vacas 1 ~ n n Hay un número de vacas dados bullpen para aceptar el bullpen, me hizo unas cuantas cabezas de ganado hasta el bullpen puede conseguir lo que quieres
ideas: Obviamente bipartita algoritmo gráfico juego algoritmo húngaro puede resolver.
Ofrezco los siguientes códigos Lowb

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 205;
bool vis[N];
int link[N];
int n,m;

vector <int>a[N];

void init()
{
    for(int i=0;i<N;i++)
        a[i].clear();
    memset(vis,0,sizeof(vis));
    memset(link,-1,sizeof(link));

}

bool match(int x)
{
    int now;

    for(int i=0;i<a[x].size();i++)
    {
        now=a[x][i];
        if(!vis[now])///如果没有遍历过
        {
            vis[now]=1;
            if(link[now]==-1||match(link[now]))///没有连接过
            {
                link[now]=x;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    while(cin >> n >> m)
    {
        init();

        for(int i=1;i<=n;i++)
        {
            int x;
            cin >> x;///每头牛有x个可接受的牛棚

            for(int j=0;j<x;j++)
            {
                int y;
                cin >> y;
                a[i].push_back(y);
            }
        }

        int res=0;

        for(int i=1;i<=n;i++)
        {
            memset(vis,0,sizeof(vis));
            if(match(i))
                res++;
        }

        cout << res << endl;
    }
    return 0;
}
Publicado 54 artículos originales · ganado elogios 0 · Vistas 1237

Supongo que te gusta

Origin blog.csdn.net/weixin_44144278/article/details/98541471
Recomendado
Clasificación