Cod sursa(job #1066224)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 24 decembrie 2013 12:28:15
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>


using namespace std;
struct nod{
int nr;
nod *next;
};
int d[100][100],p[100],ig,sg,r[100][100],in[100],out[100],cap[100];

void adauga(int a,int b,int c){
  d[a][b]=c;
  in[b]+=c;
  out[a]+=c;	
}



main(){
  ifstream fin("maxflow.in");
  ofstream fout("maxflow.out"); 
  int n,m,i,j,a,b,c;
  fin>>n>>m;
for(i=1;i<=m;i++){
	fin>>a>>b>>c;
	adauga(a,b,c);
}
int min=2;

for(i=2;i<=n-1;i++){
	if(in[i]>out[i])cap[i]=out[i];
  else cap[i]=in[i];
  if(cap[min]>cap[i])min=i;
}  

 
   int f1[100],u,f0;
    for(i=1;i<=n;i++){
	f1[i]=0;
} 
  nod *r,*p,*v;
    f1[min]=cap[min];
    r=new nod;
    r->next=NULL;    
    r->nr=min;
    p=r;
    while(r!=NULL){
    	u=r->nr;
    	f0=f1[u];
		i=2;
    	while(f0>0 && i<=n){
    		if(d[u][i]){
    		if(f1[i]==0 && i!=n){
    			v = new nod;
    			v->nr=i;
    		
    			v->next=r->next; 
				r->next=v;   			
    			
    	
    		}
			if(d[u][i]<=f0){		
				f1[i]+=	d[u][i];
				f0-=d[u][i];
				d[u][i]=0;
			}else{
				f1[i]+=f0;
				d[u][i]-=f0;
				f0=0;			
			}
		//	fout<<i<<" ";
		}
			i++; 		
    		
    	}
    cap[u]-=f1[u];
    if(!cap[u]){
    	for(i=1;i<=n;i++){
    		d[i][u]=0;
    		d[u][i]=0;
    	}   	
   
    if(r->nr==u){
      r=r->next; 	
    }
    }
     }
   fout<<f1[n];
   
   /* p=NULL;
    for(i=1;i<=n;i++){
    r = new nod;
    r->nr=in[i];
    r->next=NULL;
    if(p==NULL){
    	p=r;
    }else{
    	r->next=p; p=r;
    }
    }
    
    r=p;
    while(r!=NULL){
    	fout<<r->nr<<" ";
    	r=r->next;
    }
  */

    
    
    fin.close(); fout.close();
  
}