Cod sursa(job #1917421)

Utilizator Lungu007Lungu Ionut Lungu007 Data 9 martie 2017 12:13:19
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 1005
#define INF 110001

using namespace std;

ifstream in("maxflow.in");
ofstream out("maxflow.out");

int c[NMAX][NMAX],f[NMAX][NMAX],n,m,x,y,u,z,viz[NMAX],path[NMAX];
vector<int> a[NMAX],tr[NMAX];
queue<int> coada;

bool bfs() {

  for(int i=0;i<=n;i++) {
        viz[i] = 0;
  }

  coada.empty();
  coada.push(n);
  int nod;
  bool fnd = false;
  while(!coada.empty() && !fnd) {

    nod = coada.front(); coada.pop();

    for(int i=0;i<tr[nod].size() && !fnd;i++) {

        if(!viz[tr[nod][i]] && c[nod][tr[nod][i]]-f[nod][tr[nod][i]]>0) {
            coada.push(tr[nod][i]);
            path[tr[nod][i]] = nod;
            //cout << nod;
            if(tr[nod][i] == 1) fnd = true;
        }
    }
  }


  return fnd;
}

int main()
{
    in >> n >> m;
    for(int i=0;i<m;i++) {
        in >> x >> y >> z;
        c[x][y] = z;
        c[y][x] = z;
        if(x==y) continue;
        a[x].push_back(y);
        tr[y].push_back(x);
    }
    int flow,fmin;
    for(flow=0;bfs();flow+=fmin) {
        fmin = INF;
        for(int i=1;path[i]!=0;i=path[i]) {
            x = i;
            y = path[i];
            fmin = min(fmin, c[x][y] - f[x][y]);
        }

        for(int i=1;path[i]!=0;i=path[i]) {
            x = i;
            y = path[i];
            //cout << x << "-->" << y << "\n";
            f[y][x] += fmin;
            f[x][y] += fmin;
        }

       // for(int i=0;i<=n;i++) cout << path[i] << " ";
        //cout << endl;
        //cout << fmin << endl << endl;
    }
    out << flow;
    return 0;
}