Cod sursa(job #905038)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 5 martie 2013 14:04:00
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <fstream>
#include <queue>
#include <cstring>
#define MAX 1010
#define MAXM 10010
using namespace std;

int sol, S[MAXM], X[MAXM], Y[MAXM], cap[MAX][MAX], n, i, m, y, z, x, flux, total, from[MAX];
bool viz[MAX][2];
queue <int> Q;
vector <int> G[MAX];
vector <int> :: iterator it;
bool BF()
{
    memset(from, 0, sizeof(from));
    from[1] = -1;
    Q.push(1);
    while(!Q.empty())
    {
        x = Q.front();
        Q.pop();
        for(it = G[x].begin(); it != G[x].end(); ++it)
            if(cap[x][*it] and !from[*it])
            {
                from[*it] = x;
                Q.push(*it);
            }
    }
    return from[n];
}
void BF_final(int S, int tip)
{
    viz[S][tip] = 1;
    Q.push(S);
    while(!Q.empty())
    {
        x = Q.front();
        Q.pop();
        for(it = G[x].begin(); it != G[x].end(); ++it)
            if(cap[x][*it] and !viz[*it][tip])
            {
                viz[*it][tip] = 1;
                Q.push(*it);
            }
    }
}
int main()
{
    ifstream fi("critice.in");
    ofstream fo("critice.out");
    fi >> n >> m;
    for(i = 1; i <= m; i++)
    {
        fi >> x >> y >> z;
        cap[x][y] = cap[y][x] = z;
        G[x].push_back(y);
        G[y].push_back(x);
        X[i] = x; Y[i] = i;
    }
    while(BF())
    {
        for(it = G[n].begin(); it != G[n].end(); ++it)
        if(cap[*it][n] and from[*it])
        {
            flux = cap[*it][n];
            for(i = *it; from[i] != -1; i = from[i])
                flux = min(flux, cap[from[i]][i]);
            cap[*it][n] -= flux, cap[n][*it] += flux;
            for(i = *it; from[i] != -1; i = from[i])
                cap[from[i]][i] -= flux, cap[i][from[i]] += flux;
            total += flux;
        }
    }
    BF_final(1, 0);
    BF_final(n, 1);
    for(i = 1; i <= m; i++)
        if((viz[X[i]][0] and viz[Y[i]][1]) or (viz[Y[i]][0] and viz[X[i]][1]))
            S[++sol] = i;
    fo << sol << "\n";
    for(i = 1; i <= sol; i++) fo << S[i] << "\n";
    return 0;
}