Cod sursa(job #2984674)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 24 februarie 2023 17:16:35
Problema Critice Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

ifstream cin("critice.in");
ofstream cout("critice.out");

const int MAX = 1e3 + 1;

const int inf = 1e9 + 1;

struct muchie{

    int y , i;

};

vector <muchie> g[MAX];

int capacitate[MAX][MAX] , n , m , x , y , c , flux[MAX][MAX] , ef[MAX];

struct Dinic{

    int level[MAX];

    bool viz[MAX];

    bool bfs( int source , int sink ){

        queue <int> q;

        int x;

        q.push(source);

        for(int i = 1 ;i <= n ; i++){

            level[i] = ef[i] = 0;
        }

        level[source] = 1;

        while(!q.empty()){

            x = q.front();

            q.pop();

            for(auto it : g[x]){

                if(!level[it.y] && capacitate[x][it.y] - flux[x][it.y] > 0){

                    level[it.y] = level[x] + 1;

                    if(it.y == sink) return 1;

                    q.push(it.y);
                }
            }
        }

        return 0;
    }

    int dfs( int x , int sink , int flow){

        if( x == sink ) return flow;

        int gs = g[x].size();

        for(int i = ef[x]++ ; i < gs ; i++){

            int it = g[x][i].y;

            if(capacitate[x][it] - flux[x][it] > 0 && level[it] == level[x]+1){

                int new_flow = dfs(it,sink,min(flow,capacitate[x][it]-flux[x][it]));

                if(new_flow){

                    flux[x][it] += new_flow;
                    flux[it][x] -= new_flow;
                    return new_flow;
                }
            }
        }

        return 0;
    }

    int dinicefectiv( int source , int sink){

        int max_flow = 0;

        while(bfs(source,sink)){

            while(1){

                int flow = dfs(source,sink,inf);

                if(!flow) break;

                max_flow += flow;
            }
        }

        return max_flow;
    }

}d;

bool viz[MAX];

vector <int>muchii;

void dfs( int x ){

    viz[x] = 1;

    for(auto it : g[x]){

        if(!viz[it.y]){

           if(capacitate[x][it.y] - flux[x][it.y] <= 0){

            muchii.push_back(it.i);

            }else{

                dfs(it.y);
            }
        }
    }
}

int main(){

    cin >> n >> m;

    for(int i = 1 ; i <= m ; i++){

        cin >> x >> y >> c;

        g[x].push_back({y,i});
        g[y].push_back({x,i});

        capacitate[x][y] = c;
    }

    d.dinicefectiv(1,n);

    dfs(1);

    sort(muchii.begin(),muchii.end());

    cout << muchii.size() << '\n';

    for(auto it : muchii){

        cout << it << '\n';
    }

    return 0;
}