Cod sursa(job #2694917)

Utilizator EmeraldGames3Bogdan Oprisiu EmeraldGames3 Data 11 ianuarie 2021 08:20:29
Problema Flux maxim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>
 
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX =1000;
int capacitati[NMAX+5][NMAX+5];
///practic acesta matrice de capacitati reprezinta matricea de adiacenta a grafului residual
vector<int>g[NMAX+5];
vector<int> frunze;
/// pentru o mica optimizare amun vector in care retin nodurile care sunt penultimele dintr-un drum
///nodurile care sunt legate direct cu finish-ul
int path[NMAX+5];
bool bfs(int start, int finish)
{
   queue<int>q;
   for(int i =1; i<=finish; i++)
      path[i] = -1;
   path[start] = 0;
   q.push(start);
   while(!q.empty())
   {
      int node = q.front();
      q.pop();
      for(int i =0; i < g[node].size(); i++)
      {
        int cnode = g[node][i];
        if(capacitati[node][cnode] > 0 && path[cnode] == -1)
        {
            q.push(cnode);
            path[cnode] = node;
        }
      }
    }
    return path[finish] != -1;
}
int edmond_karp(int start, int finish){
 
   int flowMax = 0;
   while(bfs(start, finish)){
      for(int i =0; i < frunze.size(); i++)
      {
         int current = frunze[i];
         if(path[current] == 0)
            continue;
         path[finish] = frunze[i];
         int flow = INT_MAX;
         current = finish;
         while(path[current] != 0)
         {
            flow = min(flow, capacitati[path[current]][current]);
            current = path[current];
         }
         current = finish;
         while(path[current] != 0)
         {
             capacitati[path[current]][current] -= flow;
             capacitati[current][path[current]] += flow;
             current = path[current];
         }
         flowMax += flow;
      }
   }
   return flowMax;
}
 
int main()
{
    int n, m, i, a, b, c;
    fin>>n>>m;
    int start, finish;
    start = 1;
    finish = n;
    for(int i=0; i <m;i++)
    {
      fin>>a>>b>>c;
      capacitati[a][b] = c;
      g[a].push_back(b);
      if(b == finish)
        frunze.push_back(a);
    }
     //int sol = edmond_karp(start, finish);
     //fout<<sol<<"\n";
    fout<<edmond_karp(start, finish);
 
 
    return 0;
}