Cod sursa(job #941021)

Utilizator SteveStefan Eniceicu Steve Data 17 aprilie 2013 19:16:12
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.21 kb
#include <fstream>
#include <vector>
#include <cstring>
#define MAXN 1011
using namespace std;

int N, M;
vector <int> muchii[MAXN];
int viz[MAXN];
int TT[MAXN];
int cd[MAXN];
int C[MAXN][MAXN];
int F[MAXN][MAXN];
int Indice[MAXN][MAXN];
vector <int> Ans;

void Citire ()
{
    ifstream fin ("critice.in");
    fin >> N >> M;
    for (int i = 1, A, B, c; i <= M; i++)
    {
        fin >> A >> B >> c;
        muchii[A].push_back (B);
        muchii[B].push_back (A);
        C[A][B] = C[B][A] = c;
        Indice[A][B] = Indice[B][A] = i;
    }
    fin.close ();
}

int BFS ()
{
    cd[cd[0] = 1] = 1;
    memset (viz, 0, sizeof (viz));
    viz[1] = 1;
    for (int i = 1; i <= cd[0]; i++)
    {
        int nod = cd[i];
        if (nod == N) continue;
        for (int j = 0; j < muchii[nod].size (); j++)
        {
            int V = muchii[nod][j];
            if (viz[V] || C[nod][V] == F[nod][V]) continue;
            viz[V] = 1;
            cd[++cd[0]] = V;
            TT[V] = nod;
        }
    }
    return viz[N];
}

void Bag_flux ()
{
    while (BFS ())
    {
        for (int i = 0; i < muchii[N].size (); i++)
        {
            int V = muchii[N][i];
            if (!viz[V] || C[V][N] == F[V][N]) continue;
            int fmin = 2000000000;
            TT[N] = V;
            for (int nod = N; nod != 1; nod = TT[nod])
                if (fmin > C[TT[nod]][nod] - F[TT[nod]][nod]) fmin = C[TT[nod]][nod] - F[TT[nod]][nod];
            if (fmin == 0) continue;
            for (int nod = N; nod != 1; nod = TT[nod])
            {
                F[TT[nod]][nod] += fmin;
                F[nod][TT[nod]] -= fmin;
            }
        }
    }
}

vector <int> G1;
vector <int> G2;

void BF1 ()
{
    cd[cd[0] = 1] = 1;
    memset (viz, 0, sizeof (viz));
    viz[1] = 1;
    for (int i = 1; i <= cd[0]; i++)
    {
        int nod = cd[i];
        for (int j = 0; j < muchii[nod].size (); j++)
        {
            int V = muchii[nod][j];
            if (viz[V] || C[nod][V] - F[nod][V] <= 0) continue;
            viz[V] = 1;
            G1.push_back (V);
            cd[++cd[0]] = V;
        }
    }
}

void BF2 ()
{
    cd[cd[0] = 1] = N;
    memset (viz, 0, sizeof (viz));
    viz[N] = 1;
    for (int i = 1; i <= cd[0]; i++)
    {
        int nod = cd[i];
        for (int j = 0; j < muchii[nod].size (); j++)
        {
            int V = muchii[nod][j];
            if (viz[V] || C[V][nod] - F[V][nod] <= 0) continue;
            viz[V] = 1;
            G2.push_back (V);
            cd[++cd[0]] = V;
        }
    }
}

void Scriere ()
{
    ofstream fout ("critice.out");
    for (int i = 0; i < G1.size (); i++)
    {
        int x = G1[i];
        for (int j = 0; j < G2.size (); j++)
        {
            int y = G2[j];
            if (C[x][y] && C[x][y] - F[x][y] == 0)
                Ans.push_back (Indice[x][y]);
        }
    }
    fout << Ans.size () << "\n";
    for (int i = 0; i < Ans.size (); i++)
        fout << Ans[i] << "\n";
    fout.close ();
}

int main ()
{
    Citire ();
    Bag_flux ();
    G1.push_back (1);
    G2.push_back (N);
    BF1 ();
    BF2 ();
    Scriere ();
    return 0;
}