Cod sursa(job #3361120)

Utilizator iuli_morariuIuli Morariu iuli_morariu Data 20 iulie 2026 16:08:03
Problema Critice Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.26 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <stack>
#include <set>
#include <queue>
// #include <bits/std++.h>
#define in  fin
#define out fout

using namespace std;
const int NMAX = 1005;

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

struct muchie{
    int x, y, pereche, f, c, idx;
};

vector<muchie> mch;
vector<int> g[NMAX];
bool mrc[NMAX];
bool crm[NMAX];
pair<int, int> last[NMAX];
bool done_cu_flux = 0;

int n, m;

void fa_bfs_te_rog(){
    for(int i = 1; i <= n; i++){
        mrc[i] = 0;
        last[i] = {0, -1};
    }

    queue<int> q;
    q.push(1);
    mrc[1] = 1;

    while(!q.empty()){
        int x = q.front(); q.pop();
        for(const int &cine : g[x]){ // cine a INTREBAT
            // mi-o lowk stricat chefu de deltarune flowery
            // mai bine fac info decat sa ma bat cu el

            int y = mch[cine].y;
            int id = cine;

            if(!mrc[y] && mch[id].f < mch[id].c && (done_cu_flux || mch[ mch[id].pereche ].f < mch[ mch[id].pereche ].c)){
                q.push(y);
                mrc[y] = 1;

                last[y] = {x, id};
            }
        }
    }
}

void gor_et_sfb_af(){
    for(int i = 1; i <= n; i++){
        crm[i] = 0;
        last[i] = {0, -1};
    }

    queue<int> q;
    q.push(n);
    crm[n] = 1;

    while(!q.empty()){
        int x = q.front(); q.pop();
        for(const int &cine : g[x]){ // cine a INTREBAT
            // mi-o lowk stricat chefu de deltarune flowery
            // mai bine fac info decat sa ma bat cu el

            int y = mch[cine].y;
            int id = cine;

            if(!crm[y] && mch[id].f < mch[id].c && mch[ mch[id].pereche ].f < mch[ mch[id].pereche ].c){
                q.push(y);
                crm[y] = 1;
            }
        }
    }
}


int zi_cine_e_minimul(int nod, int minim_ude){
    while(last[nod].second != -1){
        minim_ude = min(minim_ude, mch[ last[nod].second ].c - mch[ last[nod].second ].f);
        nod = last[nod].first;
        if(minim_ude == 0) break;
    }
    return minim_ude;
}

void satureaza_pls(int nod, int add){
    while(last[nod].second != -1){
        int id = last[nod].second;
        mch[id].f += add;
        mch[ mch[id].pereche ].f -= add;

        nod = last[nod].first;
    }
}

signed main(){
    ios_base::sync_with_stdio(false);
    in.tie(NULL);

    in >> n >> m;
    vector<int> ralsei;
    for(int i = 0; i < m; i++){
        int x, y, c; in >> x >> y >> c;

        int id = mch.size(), idp = mch.size() + 1;
        mch.push_back({ x, y, idp, 0, c, i + 1 });
        mch.push_back({ y, x, id,  0, c, i + 1 }); // ca e neorientat au ambele c

        g[x].push_back(id);
        g[y].push_back(idp);

        if(y == n) ralsei.push_back(id);
        if(x == n) ralsei.push_back(idp);
    }

    while(true){
        fa_bfs_te_rog(); // multumesc frumos
        if(!mrc[n]) break;

        // im home alone si lowk cred ca halucinez ca tot aud chestii si NU is pisicii
        // TwT

        // cerr << "am ajuns!\n";

        for(const int &id : ralsei){
            int y = mch[id].x;

            if(!mrc[y]) continue; // ge ge getouttt

            // cerr << "--> incerc cu y = " << y << '\n';
            
            int add = zi_cine_e_minimul(y, mch[id].c - mch[id].f);
            // cerr << "--> add = " << add << '\n';

            if(add > 0){
                satureaza_pls(y, add);
                mch[id].f += add;
                mch[ mch[id].pereche ].f -= add;
            }
        }
    }
    done_cu_flux = 1;

    fa_bfs_te_rog();
    gor_et_sfb_af();

    set<int> ant_tenna;
    for(const muchie &x : mch){
        bool bun = 1;
        if(mrc[x.x] == mrc[x.y] || crm[x.x] == crm[x.y]) bun = 0;

        if(bun){
            ant_tenna.insert(x.idx);
        }
    }

    // cout << "muchii saturate :";
    // for(const muchie &x : mch){
    //     if(x.c == x.f){
    //         cout << "( " << x.x << " , " << x.y << " )\n";
    //     }
    // }

    // cout << "mrc : ";
    // for(int i = 1; i <= n; i++) cout << mrc[i] << " ";
    // cout << '\n';

    // cout << "crm : ";
    // for(int i = 1; i <= n; i++) cout << crm[i] << " ";
    // cout << '\n';

    out << ant_tenna.size() << '\n';
    for(const auto &x : ant_tenna){
        out << x << '\n';
    }


    return 0;
}