Cod sursa(job #529812)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 6 februarie 2011 09:17:41
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include<fstream.h>
#include<iostream.h>
#include<stdlib.h>
#define N 10001
#define M 100001
typedef struct nod
{int info;
struct nod *leg;}Nod,*list;
typedef struct
{Nod *prim,*ultim;}coada;
int a[M],b[M],deg[N],*g[N],i,j,k,v[N],dist[N],pair1[N],pair2[N],n,m,t;
long e;

void push(coada &q,int x)
{Nod *px=new Nod;
px->info=x;
px->leg=NULL;
if(q.prim==NULL)
       q.prim=q.ultim=px;
else
       {q.ultim->leg=px;
       q.ultim=px;}}

int pop(coada &q)
{Nod *t=q.prim->leg;
int x=q.prim->info;
free(q.prim);
q.prim=t;
if(q.prim==NULL)
     q.ultim=NULL;
return x;}

int bfs(int n,int *g[N],int deg[N],int pair1[N],int pair2[N],int dist[N])
{int i,j,k;
coada q;
q.prim=q.ultim=NULL;
for(i=1;i<=n;i++)
if(pair1[i]==0)
      {dist[i]=0;
      push(q,i);}
else
      dist[i]=M;
dist[0]=M;
while(q.prim!=NULL)
      {j=pop(q);
      if(j!=0)
              {for(k=0;k<deg[j];k++)
              if(dist[pair2[g[j][k]]]==M)
                     {dist[pair2[g[j][k]]]=dist[j]+1;
                     push(q,pair2[g[j][k]]);}}}
return (dist[0]!=M);}

int dfs(int i,int pair1[N],int pair2[N],int *g[N],int deg[N],int dist[N])
{int j;
if(i!=0)
      {for(j=0;j<deg[i];j++)
      if(dist[pair2[g[i][j]]]==dist[i]+1&&dfs(pair2[g[i][j]],pair1,pair2,g,deg,dist)==1)
            {pair2[g[i][j]]=i;
            pair1[i]=g[i][j];
            return 1;}
      dist[i]=M;
      return 0;}
return 1;}

int hopcroft_karp(int n,int m,int pair1[N],int pair2[N],int v[N],int dist[N])
{int i,j,matching=0,k;
for(i=0;i<=n;i++)
      pair1[i]=0;
for(k=0;k<=m;k++)
      pair2[k]=0;
while(bfs(n,g,deg,pair1,pair2,dist)==1)
      {for(j=1;j<=n;j++)
      if(pair1[j]==0&&dfs(j,pair1,pair2,g,deg,dist)==1)
            {matching++;
            v[matching]=j;}}
return matching;}

int main()
{ifstream f1("cuplaj.in");
ofstream f2("cuplaj.out");
f1>>n>>m>>e;
for(i=1;i<=e;i++)
      {f1>>a[i]>>b[i];
      deg[a[i]]++;}
for(j=1;j<=n;j++)
      {g[j]=(int*)malloc(deg[j]*sizeof(int));
      deg[j]=0;}
for(k=1;k<=e;k++)
      g[a[k]][deg[a[k]]++]=b[k];
t=hopcroft_karp(n,m,pair1,pair2,v,dist);
f2<<t<<endl;
for(i=1;i<=t;i++)
      f2<<pair2[pair1[v[i]]]<<" "<<pair1[v[i]]<<endl;
f1.close();
f2.close();
return 0;}