Cod sursa(job #1467331)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 3 august 2015 11:38:52
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
#define MAXN 10005
#define FOR(i, a, b)  for(int i=(int)(a);i<=(int)(b);++ i)
#define FORI(i, V)    for(vector<int>::iterator i=(V).begin();i!=(V).end();++i)
vector <int> G[MAXN];
int l[MAXN], r[MAXN], u[MAXN];
int pairup(const int n)
{
    if (u[n])
      return 0;
    u[n]=1;
    FORI(i,G[n])
      if(!r[*i])
      {
          l[n]=*i;
          r[*i]=n;
          return 1;
      }
    FORI(i,G[n])
      if(pairup(r[*i]))
      {
          l[n]=*i;
          r[*i]=n;
          return 1;
      }
    return 0;
}
int main()
{
    int n,m,cnt_edges;
    f>>n>>m>>cnt_edges;
    for(;cnt_edges--;)
    {
        int x,y;
        f>>x>>y;
        G[x].push_back(y);
    }
    for(int change=1;change;)
    {
        change=0;
        memset(u,0,sizeof(u));
        FOR(i,1,n)
          if(!l[i])
            change|=pairup(i);
    }
    int cuplaj=0;
    FOR(i,1,n)
      cuplaj+=(l[i]>0);
    g<<cuplaj<<'\n';
    FOR(i,1,n)
      if(l[i]>0)
        g<<i<<" "<<l[i]<<"\n";
    return 0;
}