Cod sursa(job #2603460)

Utilizator anamariatoaderAna Toader anamariatoader Data 19 aprilie 2020 22:11:30
Problema Critice Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

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

int n, m, i, x, y, k, c[1005][1005], f[1005][1005], tata[1005], viz[1005];
struct muchie{
    int x, y;
} a[10005];
vector <int> g[1005], sol;
queue <int> q;

void que(){
    memset(viz, 0, sizeof(viz));
    viz[1] = 1, q.push(1);
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        for(int i=0; i<g[nod].size(); i++){
            int nou = g[nod][i];
            if(!viz[nou] && f[nod][nou] < c[nod][nou])
                viz[nou] = 1, tata[nou] = nod, q.push(nou);
        }
    }
}

int mi(int nod){
    int Min = c[nod][n]-f[nod][n];
    while(nod > 1){
        Min = min(Min, c[tata[nod]][nod]-f[tata[nod]][nod]);
        nod = tata[nod];
    }
    return Min;
}

void back(){
    for(int i = 0; i < g[n].size(); i++){
        int nod = g[n][i];
        if(viz[nod]){
            int Min = mi(nod);
            if(!Min)
                continue;
            f[nod][n] += Min;
            f[n][nod] -= Min;
            while(nod > 1){
                int nou = tata[nod];
                f[nou][nod] += Min;
                f[nod][nou] -= Min;
                nod = nou;
            }
        }
    }
}

void bfs1(){
    viz[1] = 1, q.push(1);
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        for(int i = 0; i < g[nod].size(); i++){
            int nou = g[nod][i];
            if(!viz[nou] && f[nod][nou] < c[nod][nou])
                viz[nou] = 1, q.push(nou);
        }
    }
}

void bfs2(){
    viz[n] = 2, q.push(n);
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        for(int i = 0; i < g[nod].size(); i++){
            int nou = g[nod][i];
            if(!viz[nou] && f[nou][nod] < c[nou][nod])
                viz[nou] = 2, q.push(nou);
        }
    }
}

int main()
{
    fin>>n>>m;
    for(i = 1; i <= m; i++){
        fin>>x>>y>>k;
        a[i] = {x,y};
        c[x][y] = c[y][x] = k;
        g[x].push_back(y);
        g[y].push_back(x);
    }

    while(!viz[n]){
        que();
        if(viz[n])
            back();
        viz[n] = !viz[n];
    }

    memset(viz, 0, sizeof(viz));
    bfs1();
    bfs2();

    for(i = 1; i <= m; i++)
        if(viz[a[i].x] && viz[a[i].y] && viz[a[i].x] != viz[a[i].y])
            sol.push_back(i);

    fout << sol.size() << '\n';
    for(i : sol)
        fout << i << '\n';
    return 0;
}