Cod sursa(job #2059751)

Utilizator mihai.alphamihai craciun mihai.alpha Data 7 noiembrie 2017 16:03:33
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.48 kb
#include <bits/stdc++.h>

using namespace std;

FILE *fin = fopen("critice.in", "r");
FILE *fout = fopen("critice.out", "w");

#define BUF 1 << 17
char buf[BUF];
int pos = BUF;

inline char next()  {
    if(pos == BUF)
        fread(buf, 1, BUF, fin), pos = 0;
    return buf[pos++];
}

inline int read()  {
    int x = 0;
    char ch = next();
    while(!isdigit(ch))
        ch = next();
    while(isdigit(ch))
        x = x * 10 + ch - '0', ch = next();
    return x;
}

int n, m;

vector <int> v[1001];
int flx[1001][1001], cap[1001][1001], fin1[10001];

bool much1[1001];
bool much2[1001];
int A[10001], B[10001];

bool viz[1001];
int pre[1001];
int qu[1010], st, dr;

inline bool BFS()  {
    memset(viz, 0, sizeof(viz));
    pre[1] = -1;
    viz[1] = 1;
    st = dr = 1;
    qu[1] = 1;
    while(st <= dr)  {
        int nod = qu[st];
        st++;
        if(nod != n)  {
            for(auto &x : v[nod])  {
                if(flx[nod][x] != cap[nod][x] && !viz[x])  {
                    viz[x] = 1;
                    pre[x] = nod;
                    dr++;
                    qu[dr] = x;
                }
            }
        }
    }
    return viz[n];
}

inline void BFS1()  {
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;
    st = dr = 1;
    qu[1] = 1;
    while(st <= dr)  {
        int nod = qu[st];
        st++;
        for(auto &x : v[nod]) if(!viz[x]) {
            if(flx[nod][x] != cap[nod][x])  {
                much1[x] = 1;
                viz[x] = 1;
                dr++;
                qu[dr] = x;
            }
        }
    }
}

inline void BFS2()  {
    memset(viz, 0, sizeof(viz));
    viz[n] = 1;
    st = dr = 1;
    qu[1] = n;
    while(st <= dr)  {
        int nod = qu[st];
        st++;
        for(auto &x : v[nod]) if(!viz[x])  {
            if(flx[nod][x] != cap[nod][x])  {
                much2[x] = 1;
                viz[x] = 1;
                dr++;
                qu[dr] = x;
            }
        }
    }
}

int main()  {
    n = read(), m = read();
    for(int i = 1;i <= m;i++)  {
        int a, b, c;
        a = read(), b = read(), c = read();
        A[i] = a, B[i] = b;
        v[a].push_back(b);
        v[b].push_back(a);
        cap[a][b] = c;
        cap[b][a] = c;
    }
    int ans = 0;
    while(BFS())  {
        for(auto &x : v[n])  {
            if(viz[x] && flx[x][n] != cap[x][n])  {
                int flux;
                flux = INT_MAX;
                int nod = n;
                while(nod != 1)  {
                    flux = min(flux, cap[pre[nod]][nod] - flx[pre[nod]][nod]);
                    nod = pre[nod];
                }
                if(flux != 0)  {
                    nod = n;
                    while(nod != 1)  {
                        flx[pre[nod]][nod] += flux;
                        flx[nod][pre[nod]] += flux;
                        nod = pre[nod];
                    }
                }
                ans += flux;
            }
        }
    }
    BFS1();
    BFS2();
    int nr = 0;
    much1[1] = 1;
    much2[n] = 1;
    for(int i = 1;i <= m;i++)  {
        if ((much1[A[i]] * much2[B[i]] == 1 || much1[B[i]] * much2[A[i]] == 1) && (flx[A[i]][B[i]] == cap[A[i]][B[i]] || flx[B[i]][A[i]] == cap[B[i]][A[i]]) )
            fin1[++nr] = i;
    }
    fprintf(fout, "%d\n", nr);
    for(int i = 1;i <= nr;i++)
        fprintf(fout, "%d\n", fin1[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}