Cod sursa(job #1830059)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 16 decembrie 2016 02:13:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia9-cuplaj_flux Marime 1.38 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define MaxN 10005
#define INF 2140000000
 
using namespace std;
 
FILE *IN,*OUT;
 
int A[MaxN],B[MaxN],M,Asize,Bsize,X,Y,Size=0;
vector <int>Graph[MaxN];
bool execute=true,used[MaxN];
bool DFS(int node)
{
    if(used[node])return false;
    else used[node]=true;
    for(int i=0;i<Graph[node].size();i++)
    {
        if(B[Graph[node][i]]==0)
        {
            A[node]=Graph[node][i];
            B[Graph[node][i]]=node;
            return true;
        }
        else if(DFS(B[Graph[node][i]]))
        {
            A[node]=Graph[node][i];
            B[Graph[node][i]]=node;
            return true;
        }
    }
    return false;
}
int main()
{
    IN=fopen("cuplaj.in","r");
    OUT=fopen("cuplaj.out","w");
 
    fscanf(IN,"%d%d%d",&Asize,&Bsize,&M);
    for(int i=1;i<=M;i++)
    {
        fscanf(IN,"%d%d",&X,&Y);
        Graph[X].push_back(Y);
    }
    while(execute)
    {
        int Add=0;
        memset(used,0,sizeof used);
        for(int i=1;i<=Asize;i++)
            if(A[i]==0)
                if(DFS(i))
                    Add++;
        if(Add==0)
            execute=false;
        Size+=Add;
    }
    fprintf(OUT,"%d \n",Size);
    for(int i=1;i<=Asize;i++)
        if(A[i])fprintf(OUT,"%d %d\n",i,A[i]);
    return 0;
}