Cod sursa(job #3331307)

Utilizator tudorbeloiuLuka Modric tudorbeloiu Data 26 decembrie 2025 15:21:55
Problema Critice Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.2 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

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

const int NMAX = 1005;
const int INF = 1e9;

struct Muchie{
    int x,y,c,i;
    Muchie(int _x=0, int _y=0, int _c=0, int _i=0): 
        x(_x), y(_y), c(_c), i(_i){}
};

int n,m,x,y,c;
int C[NMAX][NMAX];
int F[NMAX][NMAX];

int tata[NMAX];
bool viz[NMAX];
vector<int> adj[NMAX];

vector<Muchie> muchii_init;

bool gaseste_lant_nesaturat(){

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

    queue<int> q;
    q.push(1);
    viz[1] = 1;
    tata[1] = 0;

    while(!q.empty()){
        int nod = q.front();
        q.pop();


        for(auto& neigh: adj[nod]){
            if(viz[neigh] == 0 && C[nod][neigh] > F[nod][neigh]){
                q.push(neigh);
                viz[neigh] = 1;
                tata[neigh] = nod;

                if(neigh == n)
                    return true;
            }
            else if(viz[neigh] == 0 && F[neigh][nod] > 0){
                q.push(neigh);
                viz[neigh] = 1;
                tata[neigh] = -nod; 

                if(neigh == n)
                    return true;
            }
        }
    }
    return false;

}

bool in_S[NMAX],in_T[NMAX];

void bfs_din_sursa(){
    queue<int> q;
    q.push(1);
    in_S[1] = true;
    while(!q.empty()){
        int u = q.front();
        q.pop();

        for(auto& v: adj[u]){
            if(in_S[v] == 0 && C[u][v] - F[u][v] > 0){
                in_S[v] = true;
                q.push(v);
            }
        }
    }

}

void bfs_din_destinatie(){
    queue<int> q;
    q.push(n);
    in_T[n] = true;

    while(!q.empty()){
        int v = q.front();
        q.pop();

        for(auto& u: adj[v]){
            if(in_T[u] == 0 && C[u][v] - F[u][v] > 0){
                in_T[u] = true;
                q.push(u);
            }
        }
    }
}

int main(){
    f >> n >> m;
    for(int i=1; i<=m; i++){
        f >> x >> y >> c;
        muchii_init.push_back(Muchie(x,y,c,i));
        
        adj[x].push_back(y);
        adj[y].push_back(x);

        C[x][y] = c;
        C[y][x] = c;
    }

    while(gaseste_lant_nesaturat()){
        int delta = INF;
        for(int v= n; v!= 1;){
            int u = tata[v];
            if(u > 0){
                delta = min(delta, C[u][v]-F[u][v]);
                v = u;
            }
            else{
                int real_u = -u;
                delta = min(delta, F[v][real_u]);
                v = real_u;
            }

        }
        if(delta == 0)
            break;

        for(int v=n; v!=1; ){
            int u = tata[v];
            if(u >0){
                F[u][v] += delta;
                v = u;
            }
            else{
                int real_u = -u;
                F[v][real_u] -= delta;
                v = real_u;
            }
        }
    }

    bfs_din_sursa();
    bfs_din_destinatie();

    vector<int> sol;

    for(auto& m: muchii_init){
        if(F[m.x][m.y] == m.c && in_S[m.x] && in_T[m.y]){
            sol.push_back(m.i);
        }
        else if(F[m.y][m.x] == m.c && in_S[m.y] && in_T[m.x]){
            sol.push_back(m.i);
        }
    }

    g << sol.size() << '\n';

    for(int idx: sol){
        g << idx << '\n';
    }
}