Cod sursa(job #1549425)

Utilizator martynassAlex Martinas martynass Data 12 decembrie 2015 12:21:04
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include<fstream>

using namespace std;
int l[20005],v[10001][10001],c[20005],na,viz[20005],n,m;
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;
    for(i=1;i<=e;i++)
        {
            f>>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;
return 0;
}