Cod sursa(job #2425877)

Utilizator CharacterMeCharacter Me CharacterMe Data 25 mai 2019 12:19:31
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<vector<int> > Graph(10001);
int N, M, T, E, i, j, ToRight[10001], ToLeft[10001], done, Sol, k;
bool Check[10001];
int Cuplaj(int i); char C[20];
int Read();
int main()
{
    freopen("java.in", "r", stdin);
    freopen("java.out", "w", stdout);
    fgets(C, 20, stdin); k=-1; T=Read();
    while(T--){
        k=-1;
        fgets(C, 20, stdin);
        N=Read(); M=Read(); E=Read();
        for(i=1; i<=N; ++i)
            Graph[i].push_back(0);
        for(i=1; i<=E; ++i){
            int x, y;
            k=-1;
            fgets(C, 20, stdin);
            x=Read(); y=Read();
            ++Graph[x][0]; Graph[x].push_back(y);
        }
        do{
            done=0;
            for(i=1; i<=N; ++i) Check[i]=false;
            for(i=1; i<=N; ++i) if(ToRight[i]==0) done|=Cuplaj(i);
        } while(done!=0);
        printf("%d\n", Sol);
        if(T==0) continue;
        for(i=1; i<=N; ++i){
            Graph[i].clear();
            ToRight[i]=0;
        }
        for(i=1; i<=M; ++i) ToLeft[i]=0; Sol=0;
    }
    return 0;
}
int Cuplaj(int i){
    if(Check[i]==true) return 0;
    Check[i]=true;
    int j;
    for(j=1; j<=Graph[i][0]; ++j) if(ToLeft[Graph[i][j]]==0){
        ToRight[i]=Graph[i][j];
        ToLeft[Graph[i][j]]=i;
        ++Sol;
        return 1;
    }
    for(j=1; j<=Graph[i][0]; ++j) if(Cuplaj(ToLeft[Graph[i][j]])==1){
        ToRight[i]=Graph[i][j];
        ToLeft[Graph[i][j]]=i;
        return 1;
    }
    return 0;
}
int Read(){
    int nr=0; ++k;
    for(; C[k]!='\n' && C[k]!=' '; ++k) nr=nr*10+(C[k]-'0');
    return nr;
}