Cod sursa(job #281859)

Utilizator xtephanFodor Stefan xtephan Data 16 martie 2009 08:13:47
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<stdio.h>
#define INF 0x3f3f3f

int n,m;
int A[1024][1024];
int flux[1024][1024];
int t[1024];


int flow;

void cit();
void rez();


int main() {
	
	freopen("maxflow.in", "r", stdin);
	//freopen("maxflow.out", "w", stdout);
	
	cit();
	rez();
	
	
	return 0;
}


void cit() {
	
	scanf("%d %d", &n, &m);
	
	for(int i=1; i<=m; i++) {
		int a,b,c;
		scanf("%d %d %d", &a, &b, &c);
		A[a][b]=c;
	}
	
}



int bfs() {
	
	int i;
	int inc=0,sf=0;
	
	int viz[1024];
	int coada[1024];
	
	//curatenie
	for(i=1; i<=n; i++) {
		viz[i]=0;
		t[i]=0;
	}
	
	viz[1]=1;
	coada[0]=1;
	
	
	while(inc<=sf)    {   
        int u=coada[inc++];   
           
        for(int i=1;i<=n;i++) 
            if(!viz[i]) 
                if(A[u][i] - flux[u][i] > 0) {   
                    coada[++sf]=i; 
                    t[i]=u;     
                    viz[i]=1;    
                }   
    }   
    
	if(t[n])
		return 1;
	
	return 0;
}


void rez() {
	
	int flow;
	int i,min;
	
	
	while(bfs()) {
		
		min=INF;
		
		for(i=n; i; i=t[i]) {
			
			if(A[t[i]][i]-flux[t[i]][i]<min)
				min=A[t[i]][i]-flux[t[i]][i];
			
		}
		
		for(i=n; i; i=t[i]) {
			flux[t[i]][i]+=min;
			flux[i][t[i]]-=min;
		}
		
		flow+=min;
	}
	
	printf("%d ", flow);
}