Cod sursa(job #915389)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 14 martie 2013 23:02:32
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

#define MAX 1005
#define MMAX 10005
#define INF 0x3f3f3f3f

using namespace std;

int N, M;
int F[MAX][MAX], dad[MAX], A[MMAX], B[MMAX];
bool viz[MAX], Marked[MAX][2];
vector<int> V[MAX];
queue<int> Q;


void citire() {
    ifstream in("critice.in");
    in>>N>>M;
    for(int i = 1, X, Y, C; i <= M; i++) {
        in>>X>>Y>>C;
        V[X].push_back(Y);
        V[Y].push_back(X);
        F[X][Y] = F[Y][X] = C;
        A[i] = X, B[i] = Y;
    } in.close();
}

bool bfs() {
    memset(viz, 0, sizeof(viz));
    Q.push(1); viz[1] = true;
    while(!Q.empty()) {
        int nod = Q.front(); Q.pop();
        if(nod == N) continue;
        for(size_t i = 0; i < V[nod].size(); i++) {
            int dest = V[nod][i];
            if(!F[nod][dest] || viz[dest]) continue;
            dad[dest] = nod;
            viz[dest] = true;
            Q.push(dest);
        }
    }
    return viz[N];
}

void flux() {
    while(bfs()) {
        for(size_t i = 0; i < V[N].size(); i++) {
            int nod = V[N][i], val = INF;
            if(!F[nod][N] || !viz[nod]) continue;
            dad[N] = nod;
            nod = N;
            while(nod != 1) {
                val = min(val, F[dad[nod]][nod]);
                nod = dad[nod];
            }
            if(val) {
                nod = N;
                while(nod != 1) {
                    F[dad[nod]][nod] -= val;
                    F[nod][dad[nod]] += val;
                    nod = dad[nod];
                }
            }
        }
    }
}

void dfs(int nod, int mark) {
    Marked[nod][mark] = true;
    for(size_t i = 0; i < V[nod].size(); i++) {
        int dest = V[nod][i];
        if(Marked[dest][mark] || (!mark && !F[nod][dest]) || (mark && !F[dest][nod]))
            continue;
        dfs(dest, mark);
    }
}

void afisare() {
    vector<int> ans;
    for(int i = 1; i <= M; i++)
        if((Marked[A[i]][0] && Marked[B[i]][1]) ||
           (Marked[A[i]][1] && Marked[B[i]][0]))
           ans.push_back(i);
    ofstream out("critice.out");
    out<<ans.size()<<"\n";
    for(size_t i = 0; i < ans.size(); i++) out<<ans[i]<<"\n";
    out.close();
}

int main()
{
    citire();
    flux();
    dfs(1, 0);
    dfs(N, 1);
    afisare();
    return 0;
}