Cod sursa(job #2414921)

Utilizator refugiatBoni Daniel Stefan refugiat Data 25 aprilie 2019 12:10:06
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>
using namespace std;

#define nmax 1005
#define inf 0x3f3f3f3f

int n, m, i, x, y, cap;
int t[nmax], F[nmax][nmax], C[nmax][nmax], viz[nmax][3];
vector<pair<int, int> > e;
vector<int> G[nmax];

ifstream si("critice.in");
ofstream so("critice.out");

int bfs() {
    queue<int> q;
    memset(t, 0, sizeof(t));
    q.push(1);
    t[1]=1;
    while(!q.empty()) {
        int nod=q.front();
        q.pop();
        if(nod==n)
            continue;
        for(auto &it: G[nod])
            if(!t[it]&&F[nod][it]<C[nod][it]) {
                t[it]=nod;
                q.push(it);
            }
    }
    return (t[n]!=0);
}
void maxFlow() {
    while(bfs()) {
        for(auto &it: G[n]) {
            if(!t[it]||C[it][n]==F[it][n])
                continue;
            t[n]=it;
            int fm=inf;
            for(int nod=n; nod!=1; nod=t[nod])
                fm=min(fm, C[t[nod]][nod]-F[t[nod]][nod]);
            if(!fm)
                continue;
            for(int nod=n; nod!=1; nod=t[nod]) {
                F[t[nod]][nod]+=fm;
                F[nod][t[nod]]-=fm;
            }
        }
    }
}
void vizit(int S, int D, int sens) {
    queue<int> q;
    q.push(S);
    viz[S][sens]=1;
    while(!q.empty()) {
        int nod=q.front();
        q.pop();
        if(nod==D)
            continue;
        for(auto &it: G[nod])
            if(!viz[it][sens]&&F[nod][it]<C[nod][it]&&F[it][nod]<C[it][nod]) {
                viz[it][sens]=1;
                q.push(it);
            }
    }
}
int main() {
    si>>n>>m;
    for(i=1; i<=m; i++) {
        si>>x>>y>>cap;
        e.push_back(make_pair(x, y));
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y]=cap;
        C[y][x]=cap;
    }
    maxFlow();
    vizit(1, n, 0);
    vizit(n, 1, 1);
    vector<int> sol;
    for(i=0; i<e.size(); i++) {
        int a=e[i].first;
        int b=e[i].second;
        if(F[a][b]==C[a][b]&&viz[a][0]&&!viz[b][0]&&viz[b][1]&&!viz[a][1]) {
            sol.push_back(i+1);
            continue;
        }
        if(F[b][a]==C[b][a]&&viz[b][0]&&!viz[a][0]&&viz[a][1]&&!viz[b][1])
            sol.push_back(i+1);
    }
    so<<sol.size()<<"\n";
    for(auto &it: sol)
        so<<it<<"\n";
    return 0;
}