Cod sursa(job #743811)

Utilizator mihai995mihai995 mihai995 Data 6 mai 2012 03:01:53
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int N = 1005, M = 5006, inf = 0x3f3f3f3f;
int cap[N][N], flux[N][N], indice[N][N], T[N], critice[M], n;
bool use[N], stanga[N], dreapta[N];

vector<int> Graph[N];
queue<int> Q;

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

bool reach_bfs(bool use[N], int x, int D)
{
    Q.push(x);
    use[x] = true;

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

        if (x == D)
            return true;

        for (vector<int> :: iterator it = Graph[x].begin() ; it != Graph[x].end() ; it++)
            if (!use[*it] && flux[x][*it] < cap[x][*it])
            {
                Q.push(*it);
                T[*it] = x;
                use[*it] = true;
            }
    }

    return false;
}

bool bfs(int x, int D)
{
    memset(use, false, sizeof(use));
    memset(T, 0, sizeof(T));

    return reach_bfs(use, x, D);
}

void max_flow(int S, int D)
{
    while (bfs(S, D))
    {
        int upt = inf;

        for (int i = D ; i != S ; i = T[i])
            upt = min(upt, cap[ T[i] ][i] - flux[ T[i] ][i]);

        for (int i = D ; i != S ; i = T[i])
        {
            flux[ T[i] ][i] += upt;
            flux[i][ T[i] ] -= upt;
        }
    }
/*
    for (int i = 1 ; i <= n ; i++)
    {
        for (int j = 1 ; j <= n ; j++)
            cout << "( " << flux[i][j] << " / " << cap[i][j] << " ) ";
        cout << "\n";
    }
*/
}

int main()
{
    int m, x, y;

    in >> n >> m;

    for (int i = 1 ; i <= m ; i++)
    {
        in >> x >> y;
        in >> cap[x][y];

        cap[y][x] = cap[x][y];
        indice[x][y] = indice[y][x] = i;

        Graph[x].push_back(y);
        Graph[y].push_back(x);
    }

    max_flow(1, n);

    memset(use, false, sizeof(use));

    reach_bfs(stanga, 1, -1);
    reach_bfs(dreapta, n, -1);

    for (int i = 1 ; i <= n ; i++)
        for (int j = 1 ; j <= n ; j++)
            if (cap[i][j] && stanga[i] && dreapta[j])
                critice[++critice[0]] = indice[i][j];

    for (int i = 0 ; i <= critice[0] ; i++)
        out << critice[i] << "\n";

    return 0;
}