Cod sursa(job #2660722)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 20 octombrie 2020 12:16:51
Problema Critice Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <bits/stdc++.h>
#define DIM 1010
#define INF 2000000000
using namespace std;

int capacitate[DIM][DIM],dist[DIM],st[DIM];
deque <int> c;
vector <int> L[DIM],sol;
pair <int,int> mch[DIM*10];
int n,m,i,j,x,y,cap,sursa,dest;

int bfs (int sursa, int dest){
    for (int i=1;i<=n;i++)
        dist[i] = INF;
    c.clear();
    c.push_back(sursa);
    dist[sursa] = 0;
    while (!c.empty()){
        int nod = c.front();
        c.pop_front();
        for (auto vecin : L[nod]){
            if (!capacitate[nod][vecin])
                continue;
            if (dist[vecin] == INF){
                dist[vecin] = 1 + dist[nod];
                c.push_back(vecin);
            }}}

    return dist[dest] != INF;
}

int dfs (int nod, int dest, int max_flow){
    if (nod == dest || !max_flow)
        return max_flow;

    int flow = 0;
    for (;st[nod]<L[nod].size();st[nod]++){
        int vecin = L[nod][st[nod]];
        if (dist[vecin] == 1 + dist[nod] && capacitate[nod][vecin]){

            int val = dfs (vecin,dest,min(capacitate[nod][vecin],max_flow-flow));
            flow += val;
            capacitate[nod][vecin] -= val;
            capacitate[vecin][nod] += val;
        }
    }
    return flow;
}

int main (){

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

    cin>>n>>m;
    for (i=1;i<=m;i++){
        cin>>x>>y>>cap;
        L[x].push_back(y);
        L[y].push_back(x);
        capacitate[x][y] = cap;
        capacitate[y][x] = cap;
        mch[i] = make_pair(x,y);
    }

    sursa = 1, dest = n;

    int flux, soll = 0;
    do{
        for (i=1;i<=n;i++)
            st[i] = 0;
        bfs (sursa,dest);
        flux = dfs (sursa,dest,INF);
        soll += flux;

    } while (flux);

    //cout<<soll<<"\n";

    for (i=1;i<=m;i++){
        int x = mch[i].first, y = mch[i].second;
        if (!capacitate[x][y]){ /// e saturata

            capacitate[x][y]++;

            if (bfs(sursa,dest))
                sol.push_back(i);

            capacitate[x][y]--;

        }

        if (!capacitate[y][x]){
            capacitate[y][x]++;

            if (bfs(sursa,dest))
                sol.push_back(i);

            capacitate[y][x]--;
        }
    }

    sol.resize(unique(sol.begin(),sol.end()) - sol.begin());

    cout<<sol.size()<<"\n";
    for (auto it : sol)
        cout<<it<<"\n";

    return 0;
}