Cod sursa(job #2466324)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 1 octombrie 2019 21:26:28
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.6 kb
#include <iostream>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>

#define FOR(vc,it) for( it= vc.begin();it!=vc.end();++it)
#define iter vector<int>::iterator
#define NMX 21000
using namespace std;

int n,m,e;
vector<int> v[NMX];

bool uE[NMX][NMX];
bool uV[NMX];
bool vis[NMX];
int h[NMX];
int p[NMX];
int mat[NMX];
int sum;
int main()
{
  freopen("cuplaj.in","r",stdin);
  freopen("cuplaj.out","w",stdout);
  scanf("%d %d %d",&n,&m,&e);
  for(int i=0;i<e;i++)
  {
    int j,k;
    scanf("%d %d",&j,&k);
    v[j].push_back(k+n);
    v[k+n].push_back(j);
    uE[k+n][j]=1;
  }
  while(true)
  {
    queue<int> q=queue<int>();
    memset(vis,0,n+m+1);
    memset(h,0,n+m+1);
    for(int i=1;i<=n;i++)
    {
      if(!uV[i])
      {
        q.push(i);
        vis[i]=1;
      }
    }
    vector<int> vk=vector<int>();
    int hk=INT_MAX;
    while(!q.empty())
    {
      int tp =q.front();
     // cout<<"tp: "<<tp<<"\n";
      vector<int>::iterator it;
      FOR(v[tp],it)
        if(!vis[*it]&&!uE[tp][*it])
        {
          vis[*it]=1;
          h[*it]=h[tp]+1;
          if(*it>n&& !uV[*it])
          {
      //      cout<<*it<<"\n";
            hk=h[*it];
            vk.push_back(*it);
          }
          else if(h[*it]<hk)
            q.push(*it);
        }
      q.pop();
    }
    if(vk.size()==0) break;
    iter it;
    bool match=0;
    FOR(vk,it)
    {
      stack<int> st=stack<int>();
      memset(vis,0,n+m+1);
      vis[*it]=1;
      st.push(*it);
      
      int found=-1;
      while(!st.empty())
      {
        int tp =st.top();
      //  cout<<"tp: "<<tp<<"\n";
        bool next=0;
        iter it2;
        FOR(v[tp],it2)
        {
          if(h[*it2]<h[tp]&&!vis[*it2]&&uE[tp][*it2])
          {
         //   cout<<*it2<<"\n";
            vis[*it2]=1;
            st.push(*it2);
            next=1;
            p[*it2]=tp;
            if(*it2<=n&& !uV[*it2])
            {
        //      cout<<"found:"<<*it2<<"\n";
              found=*it2;
              match=1;
              break;
            }
          }
        }
        if(!next) st.pop();
        if(found!=-1) break;
      }
      if(found==-1) continue;
      for(int nod=found;nod!=*it;nod=p[nod])
      {
     //   cout<<p[nod]<<" ";
        uE[p[nod]][nod]=!uE[p[nod]][nod];
        uE[nod][p[nod]]=!uE[nod][p[nod]];
        uV[nod]=1;
        uV[p[nod]]=1;
        mat[nod]=p[nod];
      }
     // cout<<"\n";
    }
    if(!match) break;
  }
  sum=0;
  for(int i=1;i<=n;i++)
    if(uV[i]) sum++;
  printf("%d\n",sum);
  for(int i=1;i<=n;i++)
    if(uV[i])
      printf("%d %d\n",i,mat[i]-n);
}