Cod sursa(job #1469739)

Utilizator adina0822Ciubotaru Adina-Maria adina0822 Data 9 august 2015 13:47:59
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
using namespace std;
#include<vector>
#include<fstream>
#define MAXN 10005
FILE *f=fopen ("cuplaj.in","r");
FILE *g=fopen ("cuplaj.out","w");

int n,m;
vector <int> G[MAXN];
int l[MAXN],r[MAXN],u[MAXN];

int pairup (int x)
{
    if(u[x]) return 0;
    u[x]=1;
    vector <int> :: iterator it;
    for(it=G[x].begin(); it!=G[x].end(); it++)
    if(!r[*it])
    {
        l[x]=*it;
        r[*it]=x;
        return 1;
    }
    for(it=G[x].begin(); it!=G[x].end(); it++)
    if(pairup(r[*it]))
    {
        l[x]=*it;
        r[*it]=x;
        return 1;

    }
    return 0;
}




int main()
{
    int cnt_edges,i,x,y;
    fscanf(f,"%d%d%d",&n,&m,&cnt_edges);
    while(cnt_edges--)
    {
        fscanf(f,"%d%d",&x,&y);
        G[x].push_back(y);
    }

    int change=1;
    while(change)
    {
        change=0;
        for(i=1; i<=n; i++) u[i]=0;
        for(i=1; i<=n; i++)
         if(!l[i]) change |= pairup(i);
    }
    int cuplaj=0;
    for(i=1; i<=n; i++) cuplaj+= (l[i]>0);
    fprintf(g,"%d\n",cuplaj);

    for(i=1; i<=n; i++) if(l[i])
    fprintf(g,"%d %d\n",i,l[i]);



    return 0;
}