Cod sursa(job #2214266)

Utilizator b10nd3Oana Mancu b10nd3 Data 18 iunie 2018 17:15:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<string.h>


using namespace std;

#define MAX 10001

int lft[MAX], rgt[MAX];

bool newEdge(int x, int y){
	rgt[y]=x;
    lft[x]=y;
	return true;
}

bool pairup(int x, bool viz[], vector<int> G[]){
	if(viz[x]) return false;
	viz[x]=true;
	vector<int>::iterator it;
	for(it=G[x].begin(); it!=G[x].end();it++)
	   if(!rgt[*it]) 
	       return newEdge(x,*it);
	for(it=G[x].begin(); it!=G[x].end(); it++)
	   if(pairup(rgt[*it],viz,G)) 
	       return newEdge(x,*it); 
	return false;
}


int main(){
	ifstream in("cuplaj.in");
	int n,m,e,x,y;
	bool change=true;
	in>>n>>m>>e;
	vector<int> G[n+1];
	bool viz[n+1];
	while(e--){
		in>>x>>y;
		G[x].push_back(y);
	}
	in.close();
	
	while(change){
		change=false;
		memset(viz,false,sizeof viz);
		for(e=1;e<=n;e++) 
		   if(!lft[e]) 
		     change |= pairup(e,viz,G);
	}
	
	x=0;
	for(e=1;e<=n;e++) x+= (lft[e]>0);
	
	FILE *out=fopen("cuplaj.out","w");
	fprintf(out,"%d\n",x);
	for(e=1;e<=n;e++) 
	   if(lft[e]>0) fprintf(out,"%i %i\n",e,lft[e]);
	
	return 0;
}