Cod sursa(job #854161)

Utilizator andrettiAndretti Naiden andretti Data 12 ianuarie 2013 21:15:00
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream>
using namespace std;
 
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
 
const int maxn=20010,inf=999999999;
int n1,n2,n,m;
int p,u,nrd=1,flux;
int v[maxn],t[maxn],cc[maxn];
int f[maxn][maxn];
 
void cit()
{
    int i,x,y,cost;
     
    fin>>n1>>n2>>m;
     
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        f[x+1][y+n1+1]=1;
        f[1][x+1]=1;
        f[y+n1+1][n1+n2+2]=1;
    }
    n=n1+n2+2;
}
 
int drum()
{
    int i,nod;
     
    p=u=1; cc[1]=1; v[1]=nrd; t[1]=0;
     
    while(p<=u)
    {
        nod=cc[p];
        if(nod==n) return 1;
         
        for(i=1;i<=n;i++)
            if(f[nod][i]>0 && v[i]!=nrd)
            {
                u++;
                cc[u]=i;
                t[i]=nod;
                v[i]=nrd;
            }
        p++;
    }
     
    return 0;
}
  
void flux_max()
{
    int i,k;
     
    while(drum())
    {
        for(i=n;t[i]!=0;i=t[i])
        {
            f[t[i]][i]--;
            f[i][t[i]]++;
        }
        flux++;
        nrd++;
    }
     
}
 
void afis()
{
    int i,j;
	int l1=n1+1,l2=n1+2,l3=n1+n2+1;
	
	for(i=2;i<=l1;i++)
	  for(j=l2;j<=l3;j++)
		  if(f[j][i]>0)
			  fout<<i-1<<" "<<j-n1-1<<'\n';
	
}       
 
int main()
{
    cit();
    flux_max();
    fout<<flux<<'\n';
    afis();
     
    fin.close();
    fout.close();
    return 0;
}