Cod sursa(job #851190)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 9 ianuarie 2013 17:46:36
Problema Cuplaj maxim in graf bipartit Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<iostream>
#include<fstream>
#include<string.h>
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 dfs(int nod)
{
	viz[nod]=nr;
	for(PNOD aux=v[nod];aux!=NULL;aux=aux->urm) 
		if(viz[aux->y]!=nr && aux->cap>=1) {
			p[aux->y]=aux;
			ant[aux->y]=nod;
			if(aux->y==n) {
				nod=n;
				for(PNOD it=p[n];it!=NULL;nod=ant[nod],it=p[nod]) {
					it->cap--;
					it->inv->cap++;
				}
				return 1;
			}
			if(dfs(aux->y))
				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;dfs(0);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;
}