Cod sursa(job #246312)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 20 ianuarie 2009 16:46:13
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>

using namespace std;

#define N 2048
#define INF 100000000

vector<long> a[N]; 
long q[N], tata[N], n, nr, sol[N] ;
bool c[N][N];

inline int bfs(){
	long x,p,u,j,ok=0;
	
	memset(tata,0,N * sizeof(long));
	q[0]=1;tata[1]=1;nr=0;
	
	for (p=0,u=0;p<=u;p++){
		x=q[p];
		
		for (j=0;j<a[x].size();j++)
			if (c[x][a[x][j]]>0 &&!tata[a[x][j]]){
				if (a[x][j]==n){ ok=1; continue; }
                tata[a[x][j]]=x,q[++u]=a[x][j];
			}
	}
	return (ok);
}

int main (){
	
	long x,y,e,flux=0,i,m,min,w;
    
	freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    
    scanf("%ld %ld %ld",&n,&m,&e);
    
    for (i=1 ; i<=e ; i++){ 
		scanf("%ld %ld",&x,&y);
        c[x][n+y]=1;
        a[x].push_back(n+y);
        a[n+y].push_back(x);
    }
	
	for(i=1 ; i <= n ; i++) {
		c[0][i] = 1;
		a[0].push_back(i);
		a[i].push_back(0);
	}
	
	for(i=n+1 ; i<=n+m;i++) {
		c[i][n+m+1] = 1;
		a[i].push_back(n+m+1);
		a[n+m+1].push_back(i);
	}
    
    while (bfs()){
		min=INF;
		for (w=0;w<a[n].size();w++)
            if (tata[a[n][w]]){
				min=c[a[n][w]][n];
				
				//for (i=a[n][w];i!=1;i=tata[i])
				//	if (c[tata[i]][i]<min) min=c[tata[i]][i];
				
				c[a[n][w]][n]-=min;c[n][a[n][w]]+=min;
				for (i=a[n][w];i!=1;i=tata[i]) c[tata[i]][i]-=min,c[i][tata[i]]+=min;
				
				flux+=min;
			}    
    }
    
	printf("%ld\n",flux);
    return 0;
}