Cod sursa(job #2663265)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 25 octombrie 2020 19:29:02
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda trainingflow Marime 2.12 kb
#include <bits/stdc++.h>
#define DIM 1010
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n,m,x,y,i,z,nod,vecin,fluxmin,cnt;
int flux[DIM][DIM],c[DIM][DIM],sol[10010],v[DIM],w[DIM],t[DIM];
pair<int,int> muc[10010];
vector<int> L[DIM];
bitset<DIM> f;
deque<int> q;
int bfs() {
    f.reset();
    f[1]=1;
    q.push_back(1);
    while (!q.empty()) {
        int nod=q.front();
        for (auto vecin:L[nod]) {
            if (f[vecin]==0&&c[nod][vecin]>flux[nod][vecin]) {
                f[vecin]=1;
                q.push_back(vecin);
                t[vecin]=nod;
            }
        }
        q.pop_front();
    }
    return f[n];
}
void befese(int start,int v[]) {
    f.reset();
    f[start]=1;
    q.push_back(start);
    v[start]=1;
    while (!q.empty()) {
        int nod=q.front();
        for (auto vecin:L[nod]) {
            if (f[vecin]==0&&c[nod][vecin]>max(flux[nod][vecin],-flux[nod][vecin])) {
                f[vecin]=1;
                q.push_back(vecin);
                v[vecin]=1;
            }
        }
        q.pop_front();
    }
}
int main() {
    fin>>n>>m;
    for (i=1;i<=m;i++) {
        fin>>x>>y>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        c[x][y]=c[y][x]=z;
        muc[i]={x,y};
    }
    while (bfs()) {
        for (auto vecin:L[n]) {
            fluxmin=c[vecin][n]-flux[vecin][n];
            nod=vecin;
            while (nod!=1) {
                fluxmin=min(fluxmin,c[t[nod]][nod]-flux[t[nod]][nod]);
                nod=t[nod];
            }
            flux[vecin][n]+=fluxmin;
            flux[n][vecin]-=fluxmin;
            nod=vecin;
            while (nod!=1) {
                flux[t[nod]][nod]+=fluxmin;
                flux[nod][t[nod]]-=fluxmin;
                nod=t[nod];
            }
        }
    }
    befese(1,v);
    befese(n,w);
    for (i=1;i<=m;i++) {
        x=muc[i].first;
        y=muc[i].second;
        if ((v[x]&&w[y])||(w[x]&&v[y]))
            sol[++cnt]=i;
    }
    fout<<cnt<<"\n";
    for (i=1;i<=cnt;i++)
        fout<<sol[i]<<"\n";
    return 0;
}