Cod sursa(job #606145)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 3 august 2011 14:46:48
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream.h>
#define N 10001
int a[10*N],b[10*N],w[N],*g[N],i,j,k,v[N],d[N],p[N]={0},r[N]={0},n,m;
long e,l=0;
int bfs()
{int q[10*N],z=0,u=0;
for(i=1;i<=n;i++)
if(!p[i])
      d[i]=0,q[u++]=i;
else
      d[i]=10*N;
d[0]=10*N;
while(z<u)
if((j=q[z++]))
      {for(k=0;k<w[j];k++)
      if(d[r[g[j][k]]]==10*N)
             d[r[g[j][k]]]=d[j]+1,q[u++]=r[g[j][k]];}
return (d[0]!=10*N);}
int dfs(int i)
{if(i)
      {for(j=0;j<w[i];j++)
      if(d[r[g[i][j]]]==d[i]+1&&dfs(r[g[i][j]]))
              {r[g[i][j]]=i;
              p[i]=g[i][j];
              return 1;}
      d[i]=10*N;
      return 0;}
return 1;}
int main()
{ifstream f("cuplaj.in");
ofstream h("cuplaj.out");
f>>n>>m>>e;
for(i=1;i<=e;i++)
      f>>a[i]>>b[i],w[a[i]]++;
for(j=1;j<=n;w[j++]=0)
      g[j]=(int*)malloc(w[j]*sizeof(int));
for(k=1;k<=e;k++)
      g[a[k]][w[a[k]]++]=b[k];
while(bfs())
for(j=1;j<=n;j++)
if(!p[j]&&dfs(j))
      v[++l]=j;
h<<l<<"\n";
for(i=1;i<=l;i++)
      h<<r[p[v[i]]]<<" "<<p[v[i]]<<"\n";
return 0;}