Cod sursa(job #2693176)

Utilizator AvramDanielAvram Daniel AvramDaniel Data 5 ianuarie 2021 01:02:41
Problema Critice Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include<bits/stdc++.h>
using namespace std;

#define INF 10000
#define N 1001
#define M 10001
#define fi first
#define se second

int path[N];
int adj[N][N];
int n,m;
vector<pair<int,int> > v[N];
pair<int, int> muchii[M];
bool viz[N], viz2[N];
set<int> ans;

bool bfs(){
    queue<int> q;
    for(int i = 2;i<=n;i++)
        path[i] = 0;

    path[1] = -1;
    q.push(1);
    while(!q.empty()){
        int curr = q.front();
        q.pop();
        for(auto next: v[curr]){
            if(!path[next.fi] && adj[curr][next.fi]){
                path[next.fi] = curr;
                q.push(next.fi);
            }
        }
    }
    return path[n];
}

void maxflow(){
    while(bfs()){
        for(auto pred : v[n]){
            int curr = n;
            path[n] = pred.fi;
            if(path[pred.fi] > 0){
                int flow = INF;
                while(path[curr] != -1){
                    flow = min(flow, adj[path[curr]][curr]);
                    curr = path[curr];
                }
                curr = n;
                while(path[curr] != -1){
                    adj[path[curr]][curr] -= flow;
                    adj[curr][path[curr]] += flow;
                    curr = path[curr];
                }
            }
        }
    }

}

void dfs1(int x){
    viz[x] = 1;
    for(auto next: v[x]){
        if(!viz[next.fi] && adj[x][next.fi]){
            dfs1(next.fi);
        }
    }
}

void dfs2(int x){
    viz2[x] = 1;
    for(auto next: v[x]){
        if(!viz[next.fi])
            ans.insert(next.se);
        else if(!viz2[next.fi])
            dfs2(next.fi);
    }
}

int main(){

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

    cin>>n>>m;
    for(int i = 1;i<=m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        v[a].push_back({b, i});
        v[b].push_back({a, i});
        adj[a][b] = c;
        adj[b][a] = c;
        muchii[i] = {a,b};
    }

    maxflow();

    dfs1(1);
    dfs2(1);

    cout<<ans.size()<<'\n';
    for(auto i: ans){
        cout<<i<<'\n';
    }

    return 0;
}