Cod sursa(job #3230290)

Utilizator poparobertpoparobert poparobert Data 20 mai 2024 14:18:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <vector>
#include <cstdio>
#include <map>
#include <queue>
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
vector<ll>vec[10001];
ll pN[10001],pM[10001],dummy,dist[10001];
ll n,m;
bool BFS(){
  queue<ll>q;
  for(ll i=1;i<=n;i++)if(pN[i]==dummy)q.push(i),dist[i]=0;else dist[i]=1e15;
  dist[dummy]=1e15;
  ll x;
  while(!q.empty()){
    x=q.front();
    q.pop();
    if(dist[x]<dist[dummy]){
      for(ll y:vec[x]){
        if(dist[pM[y]]==1e15){
          q.push(pM[y]);
          dist[pM[y]]=dist[x]+1;
        }
      }
    }
  }
  return dist[dummy]!=1e15;
}
bool DFS(ll x){
  if(x==dummy)return true;
  for(ll y:vec[x]){
    if(dist[pM[y]]==dist[x]+1){
      if(DFS(pM[y])){
        pN[x]=y;
        pM[y]=x;
        return true;
      }
    }
  }
  dist[x]=1e15;
  return false;
}
void cuplaj(){
  ll i;
  for(i=1;i<=n;i++)pN[i]=dummy;
  for(i=1;i<=m;i++)pM[i]=dummy;
  while(BFS()){
    for(i=1;i<=n;i++){
      if(pN[i]==dummy)DFS(i);
    }
  }
}
int main(){
  freopen("cuplaj.in","r",stdin);freopen("cuplaj.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll e,i,j,k,l,x,y;
  cin>>n>>m>>e;
  dummy=max(n+1,m+1);
  for(i=1;i<=e;i++){
    cin>>x>>y;
    vec[x].pb(y);
  }
  cuplaj();
  ll rez=0;
  for(i=1;i<=n;i++)if(pN[i]!=dummy)rez++;
  cout<<rez<<'\n';
  for(i=1;i<=n;i++)if(pN[i]!=dummy)cout<<i<<' '<<pN[i]<<'\n';
  return 0;
}