Cod sursa(job #588807)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 9 mai 2011 17:51:10
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream.h>
#define N 10001
int a[10*N],b[10*N],deg[N],*g[N],i,j,k,v[N],d[N],p1[N],p2[N],n,m,t;
long e;
int bfs(int n,int *g[N],int deg[N],int p1[N],int p2[N],int d[N])
{int i,j,k,q[10*N],p=0,u=0;
for(i=1;i<=n;i++)
if(p1[i]==0)
      {d[i]=0;
      q[u++]=i;}
else
      d[i]=10*N;
d[0]=10*N;
while(p!=u)
      {j=q[p++];
      if(j)
              {for(k=0;k<deg[j];k++)
              if(d[p2[g[j][k]]]==10*N)
                       d[p2[g[j][k]]]=d[j]+1,q[u++]=p2[g[j][k]];}}
return (d[0]!=10*N);}

int dfs(int i,int p1[N],int p2[N],int *g[N],int deg[N],int d[N])
{int j;
if(i)
      {for(j=0;j<deg[i];j++)
      if(d[p2[g[i][j]]]==d[i]+1&&dfs(p2[g[i][j]],p1,p2,g,deg,d)==1)
              {p2[g[i][j]]=i;
              p1[i]=g[i][j];
              return 1;}
      d[i]=10*N;
      return 0;}
return 1;}

int hk(int n,int m,int p1[N],int p2[N],int v[N],int d[N])
{int i,j,mg=0,k;
for(i=0;i<=n;i++)
      p1[i]=0;
for(k=0;k<=m;k++)
      p2[k]=0;
while(bfs(n,g,deg,p1,p2,d)==1)
      {for(j=1;j<=n;j++)
      if(p1[j]==0&&dfs(j,p1,p2,g,deg,d)==1)
              v[++mg]=j;}
return mg;}
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];
      deg[a[i]]++;}
for(j=1;j<=n;deg[j++]=0)
      g[j]=(int*)malloc(deg[j]*sizeof(int));
for(k=1;k<=e;k++)
      g[a[k]][deg[a[k]]++]=b[k];
t=hk(n,m,p1,p2,v,d);
h<<t<<"\n";
for(i=1;i<=t;i++)
      h<<p2[p1[v[i]]]<<" "<<p1[v[i]]<<"\n";
f.close();
h.close();
return 0;}