Cod sursa(job #1451553)

Utilizator DjokValeriu Motroi Djok Data 17 iunie 2015 16:23:05
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lnod {
    int info;
    lnod *next;
}*nod;

int i,n,m,e,x,y,l[10005],r[10005],rs;
bool u=1,viz[10005];
nod lda[10005];

void add(int x,nod &y) {
    nod p=new lnod;
    p->info=x;
    p->next=y;
    y=p;
}

bool cuplaj(int x) {
    if(viz[x]) return 0;
    viz[x]=1;

    for(nod p=lda[x];p;p=p->next)
    if(!r[p->info] || cuplaj(r[p->info]))
    {
      l[x]=p->info;
      r[p->info]=x;
      return 1;
    }
    return 0;
}

int main()
{
  ifstream cin("cuplaj.in");
  ofstream cout("cuplaj.out");

  ios_base::sync_with_stdio(0);

  for(cin>>n>>m>>e;e;--e) cin>>x>>y,add(y,lda[x]);

  while(u)
  {
    memset(viz,0,sizeof(viz));
    for(u=0,i=1;i<=n;++i)
    if(!l[i]) u|=cuplaj(i);
  }

  for(i=1;i<=n;++i) if(l[i]) ++rs;

  for(cout<<rs<<'\n',i=1;i<=n;++i)
  if(l[i]) cout<<i<<' '<<l[i]<<'\n';

 return 0;
}