Cod sursa(job #928779)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 26 martie 2013 18:07:49
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
#include<map>
using namespace std;
#define N 20010
map<short,short>cap[N],flux[N];
int n,na,nb,m,x,y,c,i,inf=100000000;
int Q[N],t[N];
struct nod{int info;nod*adr;}*v[N],*p;
int bfs(int s,int d)
{int i,p,u,nd;
  p=u=1; Q[1]=s;
  for(i=0;i<=n;i++)t[i]=0;
  t[s]=1;
	while(p<=u)
	{
		nd=Q[p++];
		nod*q=v[nd];
		while(q)
		{
		 if(cap[nd][q->info]>flux[nd][q->info])
		  if(!t[q->info])
		  {
			t[q->info]=nd;
			Q[++u]=q->info;
		  }
		  q=q->adr;
		}
	}
	return t[d];
}
int dinic(int s,int d)
{int flow=0,minn,i;
	while(bfs(s,d))
	{
	 nod*q=v[d];
	  while(q)
	  {
	   if(cap[q->info][d]>flux[q->info][d])
	   {
		  flux[q->info][d]++;
		  flux[d][q->info]--;
		 for(i=q->info;i!=s && i>0;i=t[i])
		  flux[t[i]][i]++,
		  flux[i][t[i]]--;

		 flow++;
	   }
	   q=q->adr;
	  }
	}
	return flow;
}
int main()//flux cu liste pt BFS mai rapid
{
	ifstream f("cuplaj.in");ofstream g("cuplaj.out");
	f>>na>>nb>>m;
	for(i=1;i<=m;i++)
	{
		f>>x>>y;
		x++; y=1+na+y;
		cap[x][y]=1;
		p=new nod;
		p->info=y; p->adr=v[x]; v[x]=p;
		p=new nod;
		p->info=x; p->adr=v[y]; v[y]=p;
	}
	n=1+na+nb+1;
	for(i=2;i<=na+1;i++)
	{
	    x=1; y=i;
	    cap[x][y]=1;
	    p=new nod;
		p->info=y; p->adr=v[x]; v[x]=p;
		p=new nod;
		p->info=x; p->adr=v[y]; v[y]=p;
	}
	for(i=na+2;i<n;i++)
	{
	    x=i; y=n;
	    cap[x][y]=1;
	    p=new nod;
		p->info=y; p->adr=v[x]; v[x]=p;
		p=new nod;
		p->info=x; p->adr=v[y]; v[y]=p;
	}
	g<<dinic(1,n);
	f.close();g.close();
return 0;}