Cod sursa(job #3256393)

Utilizator andiRTanasescu Andrei-Rares andiR Data 14 noiembrie 2024 14:14:06
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
// Author: Tanasescu Andrei-Rares
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <deque>
#include <iomanip>
#include <vector>
#include <cassert>

#pragma GCC optimize("O3")

#define fi first
#define se second
#define pb push_back
#define pf push_front

using namespace std;

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

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const ll Nmax=1e3+5, Kmax=55, inf=1e9+5;

int n, k;

int v[Nmax][Kmax];

vector<int> ad[Nmax];

bool vis[Nmax];
int cl[Nmax], cr[Nmax];
int cuplaj;

inline void cmp(int a, int b){
    if (v[a][0]==v[b][0])
        return;
    bool dir;
    if (v[a][0]<v[b][0])
        dir=0;
    else dir=1;

    for (int i=1; i<k; i++){
        if (v[a][i]==v[b][i])
            return;
        if (v[a][i]<v[b][i] && dir==1)
            return;
        if (v[a][i]>v[b][i] && dir==0)
            return;
    }

    if (dir==0)
        ad[a].pb(b);
    else ad[b].pb(a);
}

bool augment(int nod){
    for (auto it:ad[nod])
        if (!vis[it]){
            vis[it]=1;
            if (cr[it]==-1 || augment(cr[it])){
                cl[nod]=it;
                cr[it]=nod;
                return 1;
            }
        }
    return 0;
}

int main()
{
    fin>>n>>k;

    for (int i=0; i<n; i++){
        for (int j=0; j<k; j++)
            fin>>v[i][j];
        
        sort(v[i], v[i]+k);

        for (int j=0; j<i; j++)
            cmp(j, i);
    }

    // cuplaj

    for (int i=0; i<n; i++)
        cl[i]=cr[i]=-1;

    bool ok=1;
    while (ok){
        ok=0;
        for (int i=0; i<n; i++)
            vis[i]=0;
        
        for (int i=0; i<n; i++)
            if (cl[i]==-1 && augment(i)){
                ok=1;
                cuplaj++;
            }
    }

    fout<<n-cuplaj;

    return 0;
}