Cod sursa(job #2930545)

Utilizator RamanujanNeacsu Mihnea Ramanujan Data 28 octombrie 2022 17:26:29
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include<queue>
#include<cstring>
#define MAXN 1001
#define INF 1e6
using namespace std;
vector<int> g[MAXN];///tinem si capacitatea muchiei
int flow[MAXN][MAXN], cap[MAXN][MAXN];///fluxul preexistent pe fiecare muchie
int vis[MAXN];
int route[MAXN];///tinem ruta ca o lista simplu inlantuita, refacuta recursiv din BFS, age-old trick
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
bool bfs(int source, int finish){///functia testeaza si DACA mai exista o cale de a baga flux
    queue<int> q;
    q.push(source);
    memset(vis, 0, sizeof(vis));
    bool isPath=false;
    while(!q.empty()){
        int x=q.front();
        q.pop();
        for(int i=0; i<g[x].size(); i++){
            int next=g[x][i];
            if(flow[x][next]!=cap[x][next]&&vis[next]==0){
                vis[next]=1;
                q.push(next);
                route[next]=x;
                if(next==finish) isPath=true;
            }
        }
    }
    return isPath;///nu punem return in mijlocul functiei
}
int main()
{
    int n, m; fin>>n>>m;
    for(int i=0; i<m; i++){
        int x, y, c; fin>>x>>y>>c;
        cap[x][y]=c;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    int flux=0, minCap;
    bool isRoad=true;
    while(isRoad){
        isRoad=bfs(1, n);
        int nod=n, next;
        minCap=INF;
        while(nod!=1){///ne intoarcem de la destinatie la sursa
            next=route[nod];
            minCap=min(minCap, cap[next][nod]-flow[next][nod]);
            nod=next;
        }
        flux+=minCap;
        nod=n;
        while(nod!=1){
            next=route[nod];
            flow[next][nod]+=minCap;
            flow[nod][next]-=minCap;
            nod=next;
        }
    }
    fout<<flux;
    return 0;
}