Cod sursa(job #1471318)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 13 august 2015 16:42:22
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
#include<stdlib.h>
int a[100010],b[100010],r[10001],*g[10001],i,j,k,v[10001],d[10001],s[10001],t[10001],n,m,e,l;
int B() {
	int i,j,k,q[100010],p=0,u=0;
	for(d[0]=100010,i=1;i<=n;i++)
	if(!s[i])
    	d[i]=0,q[u++]=i;
	else
      	d[i]=100010;
	for(;p<u;)
    if(j=q[p++])
        for(k=0;k<r[j];k++)
        if(d[t[g[j][k]]]==100010)
            d[t[g[j][k]]]=d[j]+1,q[u++]=t[g[j][k]];
	return d[0]!=100010;
}
int D(int i) {
	if(i) {
		for(int j=0;j<r[i];j++)
      	if(d[t[g[i][j]]]==d[i]+1&&D(t[g[i][j]])==1) {
		  	t[g[i][j]]=i,s[i]=g[i][j];
            return 1;
		}
      	d[i]=100010;
      	return 0;
	}
	return 1;
}
int main() {
	freopen("cuplaj.in","r",stdin),freopen("cuplaj.out","w",stdout),scanf("%d%d%d",&n,&m,&e);
	for(i=1;i<=e;i++)
      	scanf("%d%d",&a[i],&b[i]),r[a[i]]++;
	for(j=1;j<=n;r[j++]=0)
      	g[j]=(int*)malloc(r[j]*sizeof(int));
	for(k=1;k<=e;k++)
      	g[a[k]][r[a[k]]++]=b[k];
	for(;B();)
    for(j=1;j<=n;j++)
    if(!s[j]&&D(j))
        v[++l]=j;
	printf("%d\n",l);
	for(i=1;i<=l;i++)
      	printf("%d %d\n",t[s[v[i]]],s[v[i]]);
}