Cod sursa(job #902850)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 1 martie 2013 16:59:56
Problema Critice Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <stdio.h>
#include <string.h>
#include <limits.h>

#define MN (1000)
#define MM (10000)
#define MIN(a, b) (a < b? a : b)

int c[MN][MN], f[MN][MN], g[MN][MN], p[MN], m[MN], q[MN], front, back;
int N, M, F;
int edge[MM][2];

int bfs(int s, int t)
{
    int n1, n2, i;
    memset(m, 0, sizeof(m)); memset(p, -1, sizeof(p));
    front = back = 0; m[s] = LONG_MAX; p[s] = s;
    for(q[back ++] = s; front < back; ++ front)
        for(n1 = q[front], i = 1; i <= g[n1][0]; ++ i) if(p[n2 = g[n1][i]] == -1 && c[n1][n2]-f[n1][n2] > 0) {
            p[n2] = n1; m[n2] = MIN(m[n1], c[n1][n2]-f[n1][n2]);
            if(n2 != t)
                q[back ++] = n2;
            else return m[t];
        }
    return m[t];
}

void ek()
{
    int n1, n2;
    for(F = 0; bfs(0, N-1); F += m[N-1]) for(n1 = N-1, n2 = p[n1]; n1; n1 = n2, n2 = p[n1])
        f[n2][n1] += m[N-1], f[n1][n2] -= m[N-1];
}

void bfs2(int s)
{
    int n1, n2, i;
    front = back = 0; m[s] = 1;
    for(q[back ++] = s; front < back; ++ front)
        for(n1 = q[front], i = 1; i <= g[n1][0]; ++ i) if(m[n2 = g[n1][i]] != 1 && c[n1][n2]-f[n1][n2] > 0)
            m[n2] = 1, q[back ++] = n2;
}

void bfs3(int s)
{
    int n1, n2, i;
    front = back = 0; m[s] = 2;
    for(q[back ++] = s; front < back; ++ front)
        for(n1 = q[front], i = 1; i <= g[n1][0]; ++ i) if(m[n2 = g[n1][i]] != 2 && c[n2][n1]-f[n2][n1] > 0)
            m[n2] = 2, q[back ++] = n2;
}

int main()
{
    int i, j, k, l;

    freopen("critice.in", "r", stdin);
    freopen("critice.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for(k = 0; k < M; ++ k) {
        scanf("%d %d %d", &i, &j, &l); -- i; -- j;
        c[i][j] = c[j][i] = l;
        g[i][++ g[i][0]] = j;
        g[j][++ g[j][0]] = i;
        edge[k][0] = i; edge[k][1] = j;
    }

    /*
    for(i = 0; i < N; ++ i, printf("\n")) for(printf("%d:", i), j = 1; j <= g[i][0]; ++ j)
        printf(" %d (%d)", g[i][j], c[i][g[i][j]]);
        */

    ek();

    /*
    for(printf("%d\n", F), i = 0; i < N; ++ i, printf("\n")) for(j = 0; j < N; ++ j)
        printf("%d(%d) ", f[i][j], c[i][j]);
        */

    memset(m, 0, sizeof(m));
    bfs2(0);
    bfs3(N-1);

    for(front = back = k = 0; k < M; ++ k) {
        i = edge[k][0]; j = edge[k][1];
        if((m[i] == 1 && m[j] == 2) || (m[i] == 2 && m[j] == 1))
            q[back ++] = k;
    }

    /*
    for(i = 0; i < N; ++ i)
        printf("%d ", m[i]); printf("\n");
        */

    for(printf("%d\n", back); front < back; ++ front)
        printf("%d\n", q[front]+1);

    return 0;
}