Cod sursa(job #2587179)

Utilizator sipdavSipos David Oliver sipdav Data 22 martie 2020 13:26:09
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <bits/stdc++.h>
	
 
	
using namespace std;
	
 
	
ifstream in("maxflow.in");
	
ofstream out("maxflow.out");
	
 
	
const int DIM = 1024;
	
const int oo = (int) (1e9);
	
 
	
int n, m, f[DIM][DIM], c[DIM][DIM], t[DIM], ca[DIM], st, dr, nod, rez, fmi;
	
bool viz[DIM];
	
vector<int> G[DIM];
	
 
	
void read()
	
{
	
    in>>n>>m;
	
    int x, y, z;
	
    for(int i = 1;i <= m;i++)
	
    {
	
        in>>x>>y>>z;
	
        c[x][y] = z;
	
        G[x].push_back(y);
	
        G[y].push_back(x);
	
    }
	
    in.close();
	
}
	
 
	
bool bfs()
	
{
	
    st = dr = 1;
	
    ca[1] = 1;
	
    memset(viz, 0, sizeof(viz));
	
    viz[1] = 1;
	
    while(st <= dr)
	
    {
	
        nod = ca[st++];
	
        if(nod == n)
	
            continue;
	
        for(int i = 0;i < G[nod].size();i++)
	
        {
	
            if(c[nod][G[nod][i]] != f[nod][G[nod][i]] && !viz[G[nod][i]])
	
            {
	
                viz[G[nod][i]] = 1;
	
                ca[++dr] = G[nod][i];
	
                t[G[nod][i]] = nod;
	
            }
	
        }
	
    }
	
    return viz[n];
	
}
	
 
	
void solve()
	
{
	
    while(bfs())
	
    {
	
        for(int i = 0;i < G[n].size();i++)
	
        {
	
            nod = G[n][i];
	
            if(c[nod][n] != f[nod][n] && viz[nod])
	
            {
	
                t[n] = nod;
	
                fmi = oo;
	
                for(nod = n;nod != 1;nod = t[nod])
	
                    fmi = min(fmi, c[t[nod]][nod] - f[t[nod]][nod]);
	
                if(fmi > 0)
	
                {
	
                    for(nod = n;nod != 1;nod = t[nod])
	
                    {
	
                        f[t[nod]][nod] += fmi;
	
                        f[nod][t[nod]] -= fmi;
	
                    }
	
                    rez += fmi;
	
                }
	
            }
	
        }
	
    }
	
}
	
 
	
void print()
	
{
	
    out<<rez;
	
    out.close();
	
}
	
 
	
int main()
	
{
	
    read();
	
    solve();
	
    print();
	
    return 0;
	
}