Cod sursa(job #2695942)

Utilizator SirbuSirbu Ioan Sirbu Data 14 ianuarie 2021 22:15:33
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <bits/stdc++.h>
#define Nmax 1005
#define Mmax 10005
using namespace std;

ifstream fin("critice.in");
ofstream fout("critice.out");


vector < pair < int, int > > graph[Nmax];
queue < int > q;

int C[Nmax][Nmax], F[Nmax][Nmax], sol[Nmax], tata[Nmax];
bool viz[Nmax], viz1[Nmax], muchie[Mmax];
int n;

bool bfs (int start){

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

    viz[start] = 1;
    q.push (start);

    while (!q.empty()){

        int node = q.front();
        q.pop();

        for (int i = 0; i < graph[node].size(); i++){
            int new_node = graph[node][i].first;
            if (viz[new_node] == 0 && F[node][new_node] < C[node][new_node]){
                viz[new_node] = 1;
                q.push (new_node);
                tata[new_node] = node;
            }
        }
    }

    return viz[n];
}

void bfs2 (int start){

    viz1[start] = 1;
    q.push (start);

    while (!q.empty ()){
        int node = q.front();
        q.pop();
        for (int i = 0; i < graph[node].size(); i++){
            int new_node = graph[node][i].first;

            if (viz1[new_node] == 0 && F[new_node][node] < C[new_node][node]){
                viz1[new_node] = 1;
                q.push (new_node);
            }
        }
    }
}

int main()
{
    int m, x, y, k = 0, z;
    fin >> n >> m;

    for (int i = 1; i <= m; i++){
        fin >> x >> y >> z;
        C[x][y] = C[y][x] = z;
        graph[x].push_back ({y, i});
        graph[y].push_back ({ x, i});
    }

    while (bfs(1) == 1) {
        for (int i = 0; i < graph[n].size(); i++){
            int node = graph[n][i].first;
            if (viz[node] == 0 || F[node][n] == C[node][n])
                continue;
            int Min = C[node][n] - F[node][n];
            while (node != 1){
                Min = min (Min, C[tata[node]][node] - F[tata[node]][node]);
                node = tata[node];
            }
            node = graph[n][i].first;
            F[node][n] += Min;
            F[n][node] -= Min;
            while (node != 1){
                F[tata[node]][node] += Min;
                F[node][tata[node]] -= Min;
                node = tata[node];
            }
        }
    }
    bfs2 (n);

    for (int i = 1; i <= n; i++){
        for (int j = 0; j < graph[i].size(); j++){
            int node = graph[i][j].first;
            int ang = graph[i][j].second;
            if (((viz[i] == 1 && viz1[node] == 1) || (viz1[i] == 1 && viz[node] == 1)) && muchie[ang] == 0){
                sol[++k] = graph[i][j].second;
                muchie[ang] = 1;
            }
        }
    }
    fout << k << '\n';
    for (int i = 1; i <= k; i++)
        fout << sol[i] << '\n';

    return 0;
}