Cod sursa(job #398717)

Utilizator ConsstantinTabacu Raul Consstantin Data 19 februarie 2010 11:11:21
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;

vector<int> l[ 10007 ],r[ 10007 ];

int m,i,j,k,a,b,s[ 10007 ],d[ 10007 ],nr,L,R;
bool viz[ 10007 ],ok;

bool Pair(int nod){
if(viz[nod])return false;
viz[nod] = true;
int N = l[nod].size(),i;

for(i = 0 ; i < N ; i++)
	if(!d[l[nod][i]] || Pair(d[l[nod][i]]))
		{s[nod] = l[nod][i];
		d[l[nod][i]] = nod;
		return true;
		}
return 0;
}

int main(){
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);

scanf("%d %d",&L,&R,&m);

for(i = 1 ; i <= m ;i++)
	{scanf("%d %d",&a,&b);
	l[a].push_back(b);
	r[b].push_back(a);
	}
ok = 1;

while(ok){
memset(viz,0,sizeof(viz));

ok = false;
for(i = 1 ; i <= L ; i++)
	if(!s[i] && Pair(i))
		{nr++;
		ok = true;
		}
}
	
printf("%d\n",nr);

for(i = 1 ; i <= L;i++)
	if(s[i])
		printf("%d %d\n",i,s[i]);


return 0;}