Cod sursa(job #2696352)

Utilizator bogdan.gusuleacGusuleac Bogdan bogdan.gusuleac Data 15 ianuarie 2021 19:11:23
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 1010;

int n, m, pr[N], cap[N][N], residual[N][N], answer, solution[N];
bool visited[10 * N];

queue <int> Q;
vector <int> v[N];

struct edge
{
    int a, b;
} M[10 * N];

bool bfs()
{
    while (!Q.empty())
        Q.pop();

    for (int i=1; i<=n; i++)
        visited[i] = 0;

    Q.push(1);
    visited[1] = 1;

    while (!Q.empty())
    {
        int nod = Q.front();
        Q.pop();
        if (nod == n)
            continue;
        for (auto it: v[nod])
        {
            if (visited[it] || cap[nod][it] == residual[nod][it])
                continue;
            visited[it] = 1;
            Q.push(it);
            pr[it] = nod;
        }
    }
    return visited[n];
}

void dfs(int q, int col)
{
    solution[q] = col;
    for (auto it: v[q])
        if (!solution[it] && abs(residual[q][it]) < abs(cap[q][it]))
            dfs(it, col);
}

int main()
{
    ifstream cin ("critice.in");
    ofstream cout ("critice.out");
    cin >> n >> m;

    int x, y, c;
    for (int i = 1; i <= m; i++)
    {
        cin >> x >> y >> c;
        cap[x][y] = cap[y][x] = c;
        v[x].push_back(y);
        v[y].push_back(x);
        M[i] = {x, y};
    }
    while (bfs())
    {
        for (auto it: v[n])
        {
            if (!visited[it] || cap[it][n] == residual[it][n])
                continue;

            pr[n] = it;
            int flow = INT_MAX;

            for (int nod = n; nod != 1; nod = pr[nod])
                flow = min(flow, cap[pr[nod]][nod] - residual[pr[nod]][nod]);

            for (int nod = n; nod != 1; nod = pr[nod])
            {
                residual[pr[nod]][nod] += flow;
                residual[nod][pr[nod]] -= flow;
            }
        }
    }

    dfs(1, 1);
    dfs(n, 2);

    for (int i=1; i<=n; i++)
        visited[i] = 0;

    for (int i=1; i<=m; i++)
        if (solution[M[i].a] && solution[M[i].b] && solution[M[i].a] != solution[M[i].b])
            answer++, visited[i] = 1;

    cout << answer << "\n";

    for (int i=1; i<=m; i++)
        if (visited[i])
            cout << i << "\n";

    return 0;
}