Cod sursa(job #2221652)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 15 iulie 2018 11:50:04
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;

vector<int> g[10005];
int viz[10005],n,m,x,y;
int l[10005], r[10005];

bool cupleaza(int nod) {
  if (viz[nod]) return 0;	
  viz[nod]=1;
  
  //attempt 1
  for (int i=0; i<g[nod].size(); ++i)
   if (l[g[nod][i]]==0) {
   	    r[nod]=g[nod][i];
   	    l[g[nod][i]]=nod;
   	    return 1;
   }
   
  //attempt 2
  for (int i=0; i<g[nod].size(); ++i)
   if ( cupleaza(l[g[nod][i]] ) ) {
   	    r[nod]=g[nod][i];
   	    l[g[nod][i]]=nod;
   	    return 1;
   }
   
   return 0;
}

int main(void) {
    ifstream cin("cuplaj.in");
	ofstream cout("cuplaj.out");
	
	int e;
	cin>>n>>m>>e;
	
	for (int i=1; i<=e; ++i) {
	   cin>>x>>y;	
	   g[x].push_back(y);
	}
	
	bool ok=1;
	while (ok) {
	   ok=0;
	   for (int i=1; i<=n; ++i)
	    if (r[i]==0) ok|=cupleaza(i);
	    
	   memset(viz,0,sizeof(viz));
	}
	
	int cpmax=0;
	for (int i=1; i<=n; ++i) 
	 if (r[i]!=0) cpmax++;
	
	cout<<cpmax<<"\n";
	
	for (int i=1; i<=n; ++i)
	 if (r[i]!=0) cout<<i<<" "<<r[i]<<"\n";
	
	return 0;
}