Cod sursa(job #374399)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 16 decembrie 2009 22:48:30
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#define pb push_back
#define mp make_pair
 
using namespace std;
 
vector <int> v[1001];
int cap[1001][1001],prev[1001],n;
 
int bf()
{
    int coada[1000],viz[1001],tail,head,nod,i,nod1;
 
    tail=0;
    head=1;
    coada[tail]=1;//bag sursa in coada
    memset(viz,0,1001*sizeof(int));
    viz[1]=1;//marchez sursa ca vizitata
    prev[1]=-1;
 
    while(tail!=head)
    {
        nod=coada[tail];
        tail++;
        for(i=0;i<(int) v[nod].size();i++)
        {
            nod1=v[nod][i];
            if(viz[nod1]==0 && cap[nod][nod1]>0)
            {
                viz[nod1]=1;
                coada[head++]=nod1;
                prev[nod1]=nod;
		if(nod1==n)
			return 1;
            }
        }
    }
   return 0;
}
                             
int flux_maxim()
{
    int flux=0,cmin=110001,nod=n,nod1;
 
    while(bf())
    {
        cmin=110001;
        while(prev[nod]!=-1)
        {
           nod1=prev[nod];
	   if(cap[nod1][nod]<cmin)
                cmin=cap[nod1][nod];
	   nod=nod1;
        }
        nod=n;
        while(prev[nod]!=-1)
        {
            nod1=prev[nod];
            cap[nod1][nod]-=cmin;
            cap[nod][nod1]+=cmin;
            nod=nod1;
        }
        flux+=cmin;    
     }
   return flux;
}
                                     
int main()
{
    int m,x,y,c,i;
    FILE *f=fopen("maxflow.in","r");
 
    fscanf(f,"%i%i",&n,&m);
    for(i=0;i<m;i++)
    {
        fscanf(f,"%i%i%i",&x,&y,&c);
        v[x].pb(y);
        v[y].pb(x);
        cap[x][y]=c;
        cap[y][x]=0;
    }
    fclose(f);
    f=fopen("maxflow.out","w");
    fprintf(f,"%i\n",flux_maxim());
    fclose(f);
    return 0;
}