Cod sursa(job #373741)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 14 decembrie 2009 22:45:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
vector<int> G[10010];
int sel[10010],st[10010],dr[10010],STEP=0,N,M,E;

int pairUp(int x){
	if (sel[x]==STEP) return 0;
	sel[x]=STEP;
	for (vector<int>::iterator it=G[x].begin();it!=G[x].end();++it)
		if (!st[*it]) { st[*it]=x; dr[x]=*it; return 1; }
	for (vector<int>::iterator it=G[x].begin();it!=G[x].end();++it)
		if (pairUp(st[*it])) { st[*it]=x; dr[x]=*it; return 1; }
	return 0;
}

int main(){
	fi>>N>>M>>E;
	int x,y;
	for (int i=1;i<=E;++i){
		fi>>x>>y;
		G[x].push_back(y);
	}
	memset(sel,0,sizeof(sel));
	memset(st,0,sizeof(st));
	memset(dr,0,sizeof(dr));
	for (int ok=1;ok;){
		ok=0;
		++STEP;
		for (int i=1;i<=N;++i) if (!dr[i]) ok|=pairUp(i);
	}
	int sol=0;
	for (int i=1;i<=N;++i) if (dr[i]) ++sol;
	fo<<sol<<"\n";
	for (int i=1;i<=N;++i) if (dr[i]) fo<<i<<" "<<dr[i]<<"\n";
	fi.close();fo.close();
	return 0;
}