Cod sursa(job #2386866)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 23 martie 2019 19:50:37
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstring>
#include <algorithm>
#include <vector>
#include <fstream>

using namespace std;

ifstream fin ("album.in");
ofstream fout ("album.out");

const int Dim = 1e4+5;
using VI = vector < int >;
using VVI = vector < VI >;
VVI G;
int A[Dim][Dim],n,k,R[Dim],L[Dim],Viz[Dim];


bool Cupleaza(int x) {

    if ( Viz[x])
        return false;
    Viz[x] = true;
    for ( const auto & y : G[x])
        if (!R[y] or Cupleaza(R[y])) {
            L[x] = y;
            R[y] = x;
            return true;
    }
    return false;
}


int main() {

    fin >> n >> k;
    G = VVI( n * 2 +1);
    for ( int i = 1; i <= n; ++i)
        for ( int j = 1; j <= k; ++j)
            fin >> A[i][j];
    for ( int i = 1; i <= n; ++i)
        sort(A[i]+1,A[i]+k+1);
    for ( int i = 1; i <= n; ++i)
        for ( int j = 1; j <= n; ++j) {

            if ( i == j)
                continue;
           bool ok = true;
            for ( int p = 1; p <= k; ++p)
            if ( A[i][p] < A[j][p] ) {
                ok  = false;
            }
            if ( ok)
                G[i].push_back(n+j);

        }
    bool ok = true;
    int cnt = 0;
    while ( ok) {
        memset(Viz,0,sizeof(Viz));
        ok = false;
        for ( int i = 1; i <= n; ++i)
            if ( !L[i] and Cupleaza(i))
                ok = true,++cnt;
    }
    fout << cnt+1;
fin.close();
    fout.close();
    return 0;
}