Cod sursa(job #2767303)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 5 august 2021 15:51:38
Problema Critice Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <bits/stdc++.h>
#define NMAX 1005

using namespace std;

ifstream f("critice.in");
ofstream g("critice.out");

int n, m, F[NMAX][NMAX], c[NMAX][NMAX], t[NMAX];
vector <int> edges[NMAX], ans;
bitset <NMAX> v;
queue <int> q;
pair <int, int> Muchii[NMAX];

bool bfs()
{
    bool ok = 0;

    for(int i = 1;  i <= n; i++)
        v[i] = 0;
    q.push(1);
    v[1] = 1;

    while(!q.empty())
    {
        int nod = q.front();
        q.pop();
        for(auto k : edges[nod])
            if(!v[k] && c[nod][k] > F[nod][k])
            {
                v[k] = 1;
                t[k] = nod;
                q.push(k);
                if(k == n)
                    ok = 1;
            }
    }

    return ok;
}

void dfs(int nod)
{
    v[nod] = 1;
    for(auto k : edges[nod])
        if(!v[k] && c[n][k] > F[n][k])
            dfs(k);
}

void flux()
{
    int minim;
    while(bfs())
    {
        for(auto k : edges[n])
            if(v[k] && c[k][n] > F[k][n])
            {
                minim = c[k][n] - F[k][n];

                int p = k;
                while(t[p])
                {
                    minim = min(minim, c[t[p]][p] - F[t[p]][p]);
                    p = t[p];
                }

                F[k][n] += minim;
                F[n][k] -= minim;

                p = k;
                while(t[p])
                {
                    F[t[p]][p] += minim;
                    F[p][t[p]] -= minim;
                    p = t[p];
                }
            }

    }
}

int main()
{
    f >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        int x, y, z;
        f >> x >> y >> z;
        edges[x].push_back(y);
        edges[y].push_back(x);
        c[x][y] = z;
        Muchii[i] = make_pair(x, y);
    }

    flux();
    for(int i = 1; i <= n; i++)
        v[i] = 0;
    dfs(1);

    for(int i = 1; i <= n; i++)
    {
        pair <int, int> k = Muchii[i];
        if(v[k.first] != v[k.second])
            ans.push_back(i);
    }

    g << ans.size() << "\n";
    for(auto k : ans)
        g << k << "\n";

    return 0;
}