Cod sursa(job #1826123)

Utilizator nnnmmmcioltan alex nnnmmm Data 10 decembrie 2016 10:31:04
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>

const int NMAX=1001,INF=2147483647;

std::vector<int> vecini[NMAX];

int flux[NMAX][NMAX],capacitate[NMAX][NMAX];
bool viz[NMAX];
int precedent[NMAX];

std::queue<int> coada;

bool bfs(int in,int sf)
{
 memset(viz,0,sizeof viz);
 memset(precedent,0,sizeof viz);
 coada.push(in);
 viz[in]=true;
 while(!coada.empty())
       {
        int x=coada.front();
        coada.pop();
        for(std::vector<int>::iterator i=vecini[x].begin();i!=vecini[x].end();i++)
            if(!viz[(*i)] && capacitate[x][(*i)]>flux[x][(*i)])
               {
                coada.push((*i));
                precedent[(*i)]=x;
                viz[(*i)]=true;
               }
       }
 return viz[sf];
}

int Marime_Flux(int in,int sf)
{
 int x=sf,rasp=INF;
 while(x!=in)
       {
        rasp=std::min(rasp,capacitate[precedent[x]][x]-flux[precedent[x]][x]);
        x=precedent[x];
       }
 return rasp;
}

void Mareste(int sf,int in,int l)
{
 int x=sf;
 while(x!=in)
       {
        flux[precedent[x]][x]+=l;
        flux[x][precedent[x]]-=l;
        x=precedent[x];
       }
}

int Flux(int in,int sf)
{
 int total=0;
 while(bfs(in,sf))
       {
        int l=Marime_Flux(in,sf);
        Mareste(sf,in,l);
        total+=l;
       }
 return total;
}

int main()
{
 FILE *in=fopen("maxflow.in","r");
 int n,m;
 fscanf(in,"%d %d ",&n,&m);
 for(int i=1;i<=m;i++)
     {
      int x,y,c;
      fscanf(in,"%d %d %d ",&x,&y,&c);
      vecini[x].push_back(y);
      vecini[y].push_back(x);
      capacitate[x][y]=c;
     }
 fclose(in);

 int rasp=Flux(1,n);
 FILE *out=fopen("maxflow.out","w");
 fprintf(out,"%d\n",rasp);
 fclose(out);
 return 0;
}