Cod sursa(job #905084)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 5 martie 2013 15:31:29
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <algorithm>
#include <queue>
#include <cstring>
#define MAX 1010
#define MAXM 10010
using namespace std;

int sol, j, Sol[MAXM], X[MAXM], Y[MAXM], cap[MAX][MAX], n, i, m, y, z, x, flux, 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)
{
    //if(tip == 1) p = -1; else p = 1;
    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] = y;
    }
    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; i != 1; i = from[i])
                flux = min(flux, cap[from[i]][i]);
            cap[*it][n] -= flux, cap[n][*it] += flux;
            for(i = *it; i != 1; i = from[i])
                cap[from[i]][i] -= flux, cap[i][from[i]] += flux;
        }
    }
    BF_final(1, 0);
    for(i = 1; i <= n; i++)
        for(j = i+1; j <= n; j++)
            swap(cap[i][j], cap[j][i]);
    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]))
            Sol[++sol] = i;
    fo << sol << "\n";
    for(i = 1; i <= sol; i++) fo << Sol[i] << "\n";
    return 0;
}