Cod sursa(job #625717)

Utilizator iulishorIulian Popescu iulishor Data 25 octombrie 2011 12:37:52
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<vector>
#include<queue>
#include<fstream>
#include<cstring>
using namespace std;
ofstream g("cuplaj.out");
vector<vector<int> > mat(10003);
int n,m,e;
struct flux
{
	int f,c;
};
flux cap[10002][10002];
int up[20002];
inline int bfs(int s, int d) 
{    
	int i,x,xx; 
	queue<int> q;     
	memset(up,-1,sizeof(up)); 
	q.push(s);
	up[s]=0;
	while(!q.empty())     
	{ 
		xx=q.front(); 
		for(i=0;i<mat[xx].size();++i) 
		{
			x=mat[xx][i]; 
			if(up[x]==-1 && cap[xx][x].f<cap[xx][x].c) 
			{ 
				q.push(x); 
				up[x]=xx; 
				if(x==d) 
					return 1;            
			}
		} 
		q.pop();
	} 
	return 0; 
} 
void fluxmax() 
{     
	int i,r,c=0,j; 
	while(bfs(0,n+m+1)) 
	{ 
		for(i=1;i<n+m+1;++i) 
			if(up[i]!=-1 && cap[i][n+m+1].f<cap[i][n+m+1].c) 
			{ 
				r=cap[i][n+m+1].c-cap[i][n+m+1].f; 
				for(j=i;j!=0 && r>0; j=up[j]) 
					r=min(r,cap[up[j]][j].c-cap[up[j]][j].f); 
				if(r==0) 
					continue; 
				cap[i][n+m+1].f+=r;
				cap[n+m+1][i].f-=r; 
				for(j=i;j!=0;j=up[j]) 
				{
					cap[up[j]][j].f+=r; 
					cap[j][up[j]].f-=r; 
				} 
				c+=r; 
			} 
	}
	g<<c<<"\n";
}
int main()
{
	ifstream f("cuplaj.in");
	f>>n>>m>>e;
	int x,y;
	for(;e;--e)
	{
		f>>x>>y;
		mat[0].push_back(x);
		mat[x].push_back(0);
		
		mat[x].push_back(y+n);
		mat[y+n].push_back(x);
		
		mat[y+n].push_back(n+m+1);
		mat[n+m+1].push_back(y+n);
		
		cap[0][x].c=1;
		cap[x][y+n].c=1;
		cap[y+n][n+m+1].c=1;
	}
	fluxmax();
}