Cod sursa(job #2006204)

Utilizator mihai.alphamihai craciun mihai.alpha Data 28 iulie 2017 22:58:01
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.25 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;

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

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

bool viz[1001];
int pre[1001];

inline bool BFS()  {
    memset(viz, 0, sizeof(viz));
    pre[1] = -1;
    viz[1] = 1;
    queue <int> q;
    q.push(1);
    while(!q.empty())  {
        int nod = q.front();
        q.pop();
        if(nod != n)  {
            for(auto &x : v[nod])  {
                if(flx[nod][x] != cap[nod][x] && !viz[x])  {
                    viz[x] = 1;
                    pre[x] = nod;
                    q.push(x);
                }
            }
        }
    }
    return viz[n];
}

inline void BFS1()  {
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;
    queue <int> q;
    q.push(1);
    while(!q.empty())  {
        int nod = q.front();
        q.pop();
        for(auto &x : v[nod]) if(!viz[x]) {
            if(flx[nod][x] == cap[nod][x])  {
                much1[x] = 1;
                viz[x] = 1;
            }
            else  {
                much1[x] = 1;
                viz[x] = 1;
                q.push(x);
            }
        }
    }
}

inline void BFS2()  {
    memset(viz, 0, sizeof(viz));
    viz[n] = 1;
    queue <int> q;
    q.push(n);
    while(!q.empty())  {
        int nod = q.front();
        q.pop();
        for(auto &x : v[nod]) if(!viz[x])  {
            if(flx[nod][x] == cap[nod][x])  {
                much2[x] = 1;
                viz[x] = 1;
            }
            else  {
                much2[x] = 1;
                viz[x] = 1;
                q.push(x);
            }
        }
    }
}

int main()  {
    fscanf(fin, "%d%d", &n, &m);
    for(int i = 1;i <= m;i++)  {
        int a, b, c;
        fscanf(fin, "%d%d%d", &a, &b, &c);
        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(int i = 0;i < v[n].size();i++)  {
            int x = v[n][i];
            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;
    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;
}