Cod sursa(job #986202)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 18 august 2013 01:32:19
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#define NM 1010
#define KM 55

using namespace std;

ifstream f("album.in");
ofstream g("album.out");

int N, K;
int i, j, k;
int A[NM][KM];
int Val[NM];
bool Viz[NM];
vector<int> G[NM];
int L[NM], R[NM];
int ANS;

bool PairUp (int node)
{
    if (Viz[node]) return 0;
    Viz[node]=1;

    for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
        if (R[*it]==0)
        {
            R[*it]=node;
            L[node]=*it;
            return 1;
        }

    for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
        if (PairUp(R[*it]))
        {
            R[*it]=node;
            L[node]=*it;
            return 1;
        }

    return 0;
}

int main ()
{
    f >> N >> K;
    for (i=1; i<=N; i++)
    {
        for (j=1; j<=K; j++)
            f >> A[i][j];

        sort(A[i]+1, A[i]+K+1);
    }

    for (i=1; i<=N; i++)
        for (j=1; j<=N; j++)
        {
            bool ok=1;
            for (k=K; k>=1 && ok==1; k--)
                if (A[i][k]<=A[j][k])
                    ok=0;
            if (ok) G[i].push_back(j);
        }

    bool ok=1;
    while (ok)
    {
        ok=0;
        memset(Viz, 0, sizeof(Viz));

        for (i=1; i<=N; i++)
            if (L[i]==0)
                ok|=PairUp(i);
    }

    for (i=1; i<=N; i++)
        ANS+=(R[i]!=0);

    g << N-ANS << '\n';

    f.close();
    g.close();

    return 0;
}