Cod sursa(job #2662442)

Utilizator KPP17Popescu Paul KPP17 Data 24 octombrie 2020 09:21:31
Problema Critice Scor 50
Compilator cpp-64 Status done
Runda trainingflow Marime 2.04 kb
#define fisier "critice"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
const int N = 1000, INF = 10000;
int C[N][N], T[N], n;
#include <vector>
std::vector<int> L[N], sol;
#include <bitset>
std::bitset<N> E;
#include <deque>
bool bfs()
{
    E = 1;
    for (std::deque<int> D = {0}; D.size(); D.pop_front())
        for (int back: L[D.front()])
            if (not E[back] and C[D.front()][back])
            {
                D.push_back(back);
                E[back] = true;
                T[back] = D.front();
                if (back == n)
                    return true;
            }
    return false;
}
int flux()
{
    int f = 0;
    while (bfs())
        for (int t: L[n])
            if (E[t] and C[t][n])
            {
                int min = C[T[n] = t][n];
                for (int i = t; i; i = T[i])
                    min = std::min(min, C[ T[i] ][i]);
                f += min;
                for (int i = n; i; i = T[i])
                {
                    C[ T[i] ][i] -= min;
                    C[i][ T[i] ] += min;
                }
            }
    return f;
}
#include <utility>
#define x first
#define y second
int main()
{
    int m, f;
    in >> n >> m; n--;
    std::vector<std::pair<int, int>> mch;
    while (m--)
    {
        int a, b, c;
        in >> a >> b >> c;
        mch.push_back({--a, --b});
        C[a][b] = C[b][a] = c;
        L[a].push_back(b);
        L[b].push_back(a);
    }
    f = flux();
    for (size_t id = 0; id < mch.size(); id++)
    {
        auto i = mch[id];
        for (auto j: mch)
        {
            C[j.x][j.y] += C[j.y][j.x];
            C[j.x][j.y] >>= 1;
            C[j.y][j.x] = C[j.x][j.y];
        }
        int prev = C[i.x][i.y];
        C[i.x][i.y] = C[i.y][i.x] = INF;
        int nou = flux();
        if (f < nou)
            sol.push_back(id);
        C[i.x][i.y] = C[i.y][i.x] = prev;
    }
    out << sol.size() << '\n';
    for (int i: sol)
        out << i+1 << '\n';
}