Cod sursa(job #1550103)

Utilizator martynassAlex Martinas martynass Data 13 decembrie 2015 11:02:30
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
int *l,**v,*c,na,*viz,n,m,*visit;
int dfs(int i)
{
    viz[i]=1;
    for(int j=1;j<=l[i];j++)
        {
            int k=v[i][j];
            if(viz[k]||c[i]==k) continue;
            if(c[k]==-1)
            {
                viz[k]=1;
                c[k]=i;
                c[i]=k;
                return 1;}
            else{ viz[k]=1;
                  if(dfs(c[k]))
                     {
                         c[i]=k;
                         c[k]=i;
                         return 1;
                     }
                  else continue;
                }
            }
            return 0;
        }

int main()
{ int i,x,y,e,j;
    ifstream f("cuplaj.in");
    f>>n>>m>>e;
l=(int*)calloc(n+1,sizeof(int));
c=(int*)calloc(n+m+5,sizeof(int));
viz=(int*)calloc(n+m+5,sizeof(int));
v=(int**)malloc((n+1)*sizeof(int));
visit=(int*)calloc(n+1,sizeof(int));
for(i=1;i<=e;i++)
{
    f>>x>>y;
    visit[x]++;
}
f.close();
ifstream fcin("cuplaj.in");
for(i=1;i<=n;i++)
    v[i]=(int*)malloc((visit[i]+1)*sizeof(int));
fcin>>n>>m>>e;
    for(i=1;i<=e;i++)
        {
            fcin>>x>>y;
            v[x][++l[x]]=y+n;
        }
for(i=1;i<=n+m;i++)
    c[i]=-1;
for(i=1;i<=n;i++)
    for(j=1;j<=l[i];j++)
        if(viz[i]==0&&viz[v[i][j]]==0)
           {
               viz[i]=1;
               viz[v[i][j]]=1;
               c[i]=v[i][j];
               c[v[i][j]]=i;
               break;
           }
int ok=1;
na=n;
while(ok)
{
    ok=0;
    for(i=1;i<=n+m;i++)
        viz[i]=0;
    for(i=1;i<=na;i++)
        if(!viz[i]&&c[i]==-1)
            if(dfs(i))
               ok=1;
}
int nr=0;
for(i=1;i<=n;i++)
   if(c[i]!=-1)
      nr++;
ofstream g("cuplaj.out");
g<<nr<<endl;
for(i=1;i<=n;i++)
  if(c[i]!=-1)
     g<<i<<' '<<c[i]-n<<endl;
fcin.close();
g.close();
return 0;
}