Cod sursa(job #2048470)

Utilizator Johnny07Savu Ioan-Daniel Johnny07 Data 26 octombrie 2017 00:37:06
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int minn=(1<<30);
vector <int> drum[1001];
int capac[1001][1001];
int vizit[1001],ant[1001],n,m,c[1001];
int sol;
queue <int> q;

void BFS (int node)
{
    int i;
q.push(node);
memset(vizit,0,sizeof(vizit));
memset(ant,0,sizeof(ant));
vizit[node]=1;
while (!q.empty())
{
node=q.front();
if (node==n)
{
    while (!q.empty()) q.pop();
    return;
}
q.pop();
for (i=0;i<drum[node].size();i++)
{
    if (vizit[drum[node][i]]==0 && capac[node][drum[node][i]]>0)
    {
        q.push(drum[node][i]);
        vizit[drum[node][i]]=1;
        ant[drum[node][i]]=node;
    }
}
}

}



int main()
{
    int x,y,z,i,mi;
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>x>>y>>z;
drum[x].push_back(y);
drum[y].push_back(x);
capac[x][y]=z;
}
int aux;
int estedrum=1;
while (estedrum==1)
{
    BFS(1);
    if (vizit[n]==0) break;
else
{
    for (i=0;i<drum[n].size();i++) if (vizit[drum[n][i]]==1)
    {
    x=drum[n][i];
    mi=minn;
    mi=min(capac[drum[n][i]][n],mi);
    while (ant[x]!=0)
    {
    mi=min(mi,capac[ant[x]][x]);
    x=ant[x];
    }
    sol+=mi;
    x=drum[n][i];
    while (ant[x]!=0)
    {
        capac[ant[x]][x]-=mi;
        capac[x][ant[x]]+=mi;
    x=ant[x];
    }
    capac[drum[n][i]][n]-=mi;
    capac[n][drum[n][i]]+=mi;

    }

}
}
g<<sol;

    return 0;
}