Cod sursa(job #1549318)

Utilizator DjokValeriu Motroi Djok Data 12 decembrie 2015 11:20:27
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<bits/stdc++.h>
using namespace std;

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

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

void add(int x,nod &y) {
    nod p=new lnod;
    p->nod=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->nod] || cuplaj(r[p->nod]))
    {
      l[x]=p->nod;
      r[p->nod]=x;
      return 1;
    }

    return 0;
}

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

  ios_base::sync_with_stdio(0); cin.tie(0);

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

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

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

  cout<<rs<<'\n';

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

 return 0;
}