Cod sursa(job #748858)

Utilizator DeepGreenBurcea Iulian-Catalin DeepGreen Data 14 mai 2012 23:40:57
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<iostream>
#include<fstream>
using namespace std;
#include<queue>
#define maxn 1005
#define maxm 5005
int const maxc=110005;

struct lista{
	int vec;
	lista *next;
};

lista *v[maxn];
int c[maxn][maxn],flux[maxn][maxn],pred[maxn],cf[maxn][maxn];

FILE *f,*g;

void citire(int &N, int &M){
	f=fopen("maxflow.in","r");
	g=fopen("maxflow.out","w");
	fscanf (f, "%d", &N);
	fscanf (f, "%d", &M);
	int varf1,varf2;
	lista *p,*q;
		for(int i=1;i<=M;i++){
			fscanf (f, "%d", &varf1);
			fscanf (f, "%d", &varf2);
			fscanf (f, "%d", &c[varf1][varf2]);
			cf[varf1][varf2]=c[varf1][varf2];
			p=v[varf1];
				if(p==NULL){
					p=new lista;
					p->vec=varf2;
					p->next=NULL;
					v[varf1]=p;
				}
				else{
					q=new lista;
					q->next=p;
					q->vec=varf2;
					v[varf1]=q;
				}
			}
}		


int drum(int N,bool viz[maxn]){
	queue<int> coada;
	for(int i=1;i<=N;i++){
		pred[i]=0;
		viz[i]=0;
	}
	lista *p;
	coada.push(1);
	viz[1]=1;
	while(!coada.empty()){
		int k=coada.front();
		p=v[k];
		coada.pop();
		while(p!=NULL){
			if(viz[p->vec]==0&&cf[k][p->vec]){
				coada.push(p->vec);
				pred[p->vec]=k;
				viz[p->vec]=1;
				if(p->vec==N)
					return 1;
				p=p->next;
			}
			else
				p=p->next;
			if(p==NULL&&!coada.empty()){
					k=coada.front();
					p=v[k];
					coada.pop();
			}
		}
	}
	return 0;
}

void max_flow(int N,bool viz[maxn]){
	int maxf=0,min=maxc;
	while(drum(N,viz)){
		int k=N;
		while(pred[k]){
			if(cf[pred[k]][k]&&cf[pred[k]][k]<min){
				min=cf[pred[k]][k];
			}
			k=pred[k];
		}
		k=N;
		while(pred[k]){
			flux[pred[k]][k]+=min;
			cf[pred[k]][k]-=min;
			k=pred[k];
		}
		maxf+=min;
	}
	fprintf(g,"%d", maxf);
}

int main(){
	int N,M;
	bool viz[maxn];
	citire(N,M);
	max_flow(N,viz);
	return 0;
}