Cod sursa(job #1882300)

Utilizator DobosDobos Paul Dobos Data 17 februarie 2017 08:40:27
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <bits/stdc++.h>
#define NMAX 1050
#define INF 1e9
#define  f first
#define s second
using namespace std;

ifstream fin("critice.in");
ofstream fout("critice.out");

vector < int > G[NMAX];

int C[NMAX][NMAX],F[NMAX][NMAX],ant[NMAX];
bool B[NMAX],M[NMAX][2];
vector < pair < int, int > > E;

void DFS(const int &nod,const int &n){
    M[nod][n] = 1;
    for(auto const &it : G[nod]){
        if(!M[it][n] && ( (!n && C[nod][it] > F[nod][it]) || (n && C[it][nod] > F[it][nod]) ) )
        DFS(it,n);
    }

}


bool BFS(const int &N){
    int nod;
    memset(B,0,NMAX);
    B[1] = 1;
    queue < int > Q;
    Q.push(1);

    while(!Q.empty()){
        nod = Q.front();
        Q.pop();

        if(nod == N) continue;

        for(auto const &it : G[nod]){
            if(B[it] || C[nod][it] == F[nod][it]) continue;
            B[it] = 1;
            Q.push(it);
            ant[it] = nod;


        }
    }

    return B[N];

}


int main()
{
    ios :: sync_with_stdio(false);
    fin.tie(NULL);

    int n,m,c,x,y;

    fin >> n >> m;

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

        fin >> x >> y >> c;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y] =  C[y][x] = c;
        E.push_back({x,y});
    }

        int mflow;

    while(BFS(n)){
        for(auto const &it : G[n]){

            if(!B[it] || F[it][n] == C[it][n]) continue;

            ant[n] = it;
            mflow = INF;

            for(int i = n; i != 1; i = ant[i]){
                mflow = min(mflow,C[ant[i]][i] - F[ant[i]][i]);

            }

            if(mflow == 0) continue;

            for(int i = n; i != 1; i = ant[i]){

                F[ant[i]][i] += mflow;
                F[i][ant[i]] -= mflow;

            }
        }

    }

    DFS(1,0);
    DFS(n,1);

    int i = 0;
    vector < int > S;

    for(auto const &it : E){
        i++;
        if((C[it.f][it.s] == F[it.f][it.s] || C[it.s][it.f] == F[it.s][it.f]) && ((M[it.f][0] && M[it.s][1]) || (M[it.s][0] && M[it.f][1])))
            S.push_back(i);
    }

    fout << S.size() << "\n";

     for(auto const &it : S)
        fout << it << "\n";

    return 0;
}