Cod sursa(job #851188)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 9 ianuarie 2013 17:45:17
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<iostream>
#include<fstream>
using namespace std;

#define NMAX 20005

struct nod {
	int y,cap;
	nod *urm,*inv;
};
typedef nod* PNOD;

PNOD v[NMAX],p[NMAX];
int viz[NMAX],c[NMAX],ant[NMAX],n,nr,ok;

PNOD creare(int y, int cap)
{
	PNOD aux;
	aux=new nod;
	aux->urm=0;
	aux->inv=0;
	aux->y=y;
	aux->cap=cap;
	return aux;
}

void adauga(int x, int y)
{
	PNOD a,b;
	a=creare(y,1);
	b=creare(x,0);
	a->inv=b;
	b->inv=a;
	a->urm=v[x];
	b->urm=v[y];
	v[x]=a;
	v[y]=b;
}

int bfs(int n)
{
	int st,dr,nod;
	PNOD aux,it;
	st=1;
	dr=1;
	c[st]=0;
	memset(viz,0,sizeof(viz));
	viz[0]=1;
	p[0]=0;
	while(st<=dr) {
		nod=c[st];
		st++;
		for(aux=v[nod];aux!=NULL;aux=aux->urm) 
			if(viz[aux->y]==0 && aux->cap>=1) {
				c[++dr]=aux->y;
				viz[aux->y]=1;
				p[aux->y]=aux;
				ant[aux->y]=nod;
				if(aux->y==n) {
					for(it=p[n],nod=n;it!=NULL;nod=ant[nod],it=p[nod]) {
						it->cap--;
						it->inv->cap++;
					}
					return 1;
				}
			}
	}
	return 0;
}

int main ()
{
	int n1,n2,m,i,x,y,cuplaj;
	PNOD aux;
	ifstream f("cuplaj.in");
	ofstream g("cuplaj.out");
	f>>n1>>n2>>m;
	for(i=0;i<=n1+n2+1;i++)
		v[i]=0;
	for(i=1;i<=m;i++) {
		f>>x>>y;
		adauga(x,y+n1);
	}
	f.close();
	for(i=1;i<=n1;i++) 
		adauga(0,i);
	for(i=1;i<=n2;i++)
		adauga(i+n1,n1+n2+1);
	for(cuplaj=0,n=n1+n2+1,nr=1;bfs(n);cuplaj++,nr++);
	g<<cuplaj<<'\n';
	for(i=1;i<=n1;i++)
		for(aux=v[i];aux!=NULL;aux=aux->urm)
			if(aux->cap==0 && aux->y)
				g<<i<<" "<<aux->y-n1<<'\n';
	g.close();
	return 0;
}