Cod sursa(job #880915)

Utilizator deneoAdrian Craciun deneo Data 17 februarie 2013 15:23:07
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

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

#define MAXN 1100
#define MAXM 11000
#define INF 0x3f3f3f3f
#define FORIT(it, v) for(typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)

int N, M, F[MAXN][MAXN], C[MAXN][MAXN], dad[MAXN], mark1[MAXN], mark2[MAXN], sol[MAXM];
vector<int> graph[MAXN];
vector< pair<int, int> > edges;

bool DFS() {
    int coada[MAXN], poz = 1;

    memset(dad, 0, sizeof(dad));

    coada[0] = 1; coada[1] = 1; dad[1] = 1;

    while (poz <= coada[0]) {
        int nod = coada[poz];
        ++poz;

        if (nod == N)
            return 1;

        FORIT(it, graph[nod])
            if (!dad[*it] && C[nod][*it] - F[nod][*it]) {
                coada[++coada[0]] = *it;
                dad[*it] = nod;
            }
    }

    return 0;
}

void markNodes(int nod, int mark[MAXN]) {
    mark[nod] = 1;

    FORIT(it, graph[nod])
        if (!mark[*it] && C[nod][*it] > F[nod][*it])
            markNodes(*it, mark);
}

int main () {
    fin >> N >> M;

    for (int i = 1; i <= M; ++i) {
        int x, y, c;

        fin >> x >> y >> c;

        edges.push_back(make_pair(x, y));

        graph[x].push_back(y);
        graph[y].push_back(x);

        C[x][y] = c;
        C[y][x] = c;
    }

    while (DFS()) {
        int minim = INF;

        for (int i = N; i > 1; i = dad[i])
            minim = min (minim, C[dad[i]][i] - F[dad[i]][i]);
        for (int i = N; i > 1; i = dad[i]) {
            F[dad[i]][i] += minim;
            F[i][dad[i]] -= minim;
        }
    }

    markNodes(1, mark1);
    markNodes(N, mark2);

    FORIT(it, edges) {
        int nod1 = (*it).first;
        int nod2 = (*it).second;

        if (C[nod1][nod2] == F[nod1][nod2] && mark1[nod1] && mark2[nod2])
            sol[++sol[0]] = it - edges.begin() + 1;
        if (C[nod2][nod1] == F[nod2][nod1] && mark1[nod2] && mark2[nod1])
            sol[++sol[0]] = it - edges.begin() + 1;
    }

    fout << sol[0] << "\n";

    for (int i = 1; i <= sol[0]; ++i)
        fout << sol[i] << "\n";

    return 0;
}