Cod sursa(job #34315)

Utilizator cromdioxidSasa Pastor cromdioxid Data 20 martie 2007 17:16:52
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 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, j;
    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); )
        for (i = 1; i <= N; i++)
        {
            if (!T[i] || C[i][D] <= F[i][D])
                continue;
            r = C[i][D] - F[i][D];
            for (j = i; j != S; j = T[j])
                r = min(r, C[T[j]][j] - F[T[j]][j]);
            if (r == 0)
                continue;
            F[i][D] += r;
            F[D][i] -= r;
            for (j=i; j !=S; j = T[j])
            {
                F[T[j]][j] += r;
                F[j][T[j]] -= r;
            }
            flux += 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;
}