Cod sursa(job #34298)

Utilizator cromdioxidSasa Pastor cromdioxid Data 20 martie 2007 16:55:20
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NMAX 1001
#define MMAX 10001
int T[NMAX], C[NMAX][NMAX], F[NMAX][NMAX], N, M, m[MMAX][2], T2[NMAX], S, D;

int min(int a, int b)
{
    return (a > b ? b : a);
}
int BF(int s, int d)
{
    int q[NMAX], p, u, nod, i;
    memset(T, 0, sizeof(T));
    for (p = u = 0, q[0] = s, T[s] = -1; p <= u; p++)
    {
        nod = q[p];
        for (i = 1; i <= N; i++)
            if (!T[i] && C[nod][i] > F[nod][i])
            {
                q[++u] = i;
                T[i] = nod;
                if (i == d) return 1;
            }
    }
    return 0;
}

int main()
{
    int i, a, b, c, flux, r, num;
    freopen("critice.in", "rt", stdin);
    freopen("critice.out", "wt", stdout);
    scanf("%d %d", &N, &M);
    for (i = 1; i <= M; i++)
    {
        scanf("%d %d %d", &a, &b, &c);
        m[i][0] = a;
        m[i][1] = b;
        C[a][b] = C[b][a] = c;
    }
    S = 1;
    D = N;
    for (flux = 0; BF(S, D); flux += r)
    {
        for (r = 2000000000, i = D; i != S; i = T[i])
            r = min(r, C[T[i]][i] - F[T[i]][i]);
        for (i = D; i != S; i = T[i])
            F[T[i]][i] += r, F[i][T[i]] -= r;
    }

    int p, u, q[NMAX], nod;
    memset(T, 0, sizeof(T));
    for (p = u = 0, q[0] = 1, T[1] = -1; p <= u; p++)
    {
        nod = q[p];
        for (i = 1; i <= N; i++)
            if (!T[i] && C[nod][i] != F[nod][i])
            {
                q[++u] = i;
                T[i] = nod;
            }
    }
    memset(T2, 0, sizeof(T2));
    for (p = u = 0, q[0] = N, T2[N] = -1; p <= u; p++)
    {
        nod = q[p];
        for (i = 1; i <= N; i++)
            if (!T2[i] && C[i][nod] != F[i][nod])
            {
                q[++u] = i;
                T2[i] = nod;
            }
    }

    for (i = 1, num = 0; i <= M; i++)
        if (((T[m[i][0]] && T2[m[i][1]]) || (T[m[i][1]] && T2[m[i][0]])) && C[m[i][0]][m[i][1]] == abs(F[m[i][0]][m[i][1]]))
            num ++;
    printf("%d\n", num);
    for (i = 1; i <= M; i++)
        if (((T[m[i][0]] && T2[m[i][1]]) || (T[m[i][1]] && T2[m[i][0]])) && C[m[i][0]][m[i][1]] == abs(F[m[i][0]][m[i][1]]))
            printf("%d\n", i);
    return 0;
}