Cod sursa(job #2697147)

Utilizator QubeeStefan Ste Qubee Data 17 ianuarie 2021 18:58:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

int n,m,q,i,ok,nr,ap[100005],st[100005],dr[100005];
vector <int> v[100005];

bool pot(int x){

    if(ap[x]) return 0;
    int y=0;
    ap[x]=1;

    for(int k=1; k<=v[x][0]; k++){

        y=v[x][k];
        if(st[y]==0){

            dr[x]=y;
            st[y]=x;
            return 1;
        }
    }

    for(int k=1; k<=v[x][0]; k++){

        y=v[x][k];

        if(pot(st[y])){
            dr[x]=y;
            st[y]=x;
            return 1;
        }
    }
    return 0;
}


int main(){

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

    f>>n>>m>>q;

    for(i=1; i<=n; i++)
        v[i].push_back(0);

    for(i=1; i<=q; i++){
        int x,y;

        f>>x>>y;
        v[x][0]++;
        v[x].push_back(y);
    }
    ok=1;

    while(ok){
        ok=0;

        for(i=1; i<=n; i++)
            ap[i]=0;

        for(i=1; i<=n; i++)
            if(dr[i]==0&&pot(i)==1){
                ok=1;
                nr++;
            }
    }
    g<<nr<<endl;

    for(i=1; i<=n; i++){
        if(dr[i]) g<<i<<" "<<dr[i]<<endl;
    }

    return 0;
}