Cod sursa(job #2084233)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 8 decembrie 2017 20:18:33
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.97 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("critice.in");
ofstream out ("critice.out");
const int dim = 1001;
int graf[dim],vec[dim],tata[dim],rez[dim],mark[dim][dim];
int cap[dim][dim],ind[dim][dim],flux[dim][dim];
int n,k,m,a,b,c;
vector<int>v[dim];
bool bfs () {
    for (int i = 1; i <= n;i ++) {
        graf[i] = 0;
    }
    bool ok = 0;
    vec[1] = 1;
    graf[1] = 1;
    tata[1] = 0;
    for (int st = 1, dr = 1; st <= dr; st ++) {
        a = vec[st];
        for (int i = 0; i < v[a].size(); i ++) {
            b = v[a][i];
            if (graf[b] == 0 && cap[a][b] > flux[a][b]) {
                if (b not_eq n){
                    tata[b] = a;
                    vec[++dr] = b;
                    graf[b] = 1;
                }
                else{
                    ok = 1;
                }
            }
        }
    }
    if (ok == 1){
        return 1;
    }
    else{
        return 0;
    }
}
void solve_bfs(int s, int f, int caz) {
    for (int i = 1; i <= n;i ++) {
        graf[i] = 0;
    }
    int x,y;
    vec[1] = s;
    graf[s] = 1;
    for (int st = 1, dr = 1; st <= dr; st ++) {
        a = vec[st];
        for (int i = 0; i < v[a].size(); i ++) {
            b = v[a][i];
            x = a; y = b;
            if (caz) {
                x = b; y = a;
            }
            if (cap[x][y] == flux[x][y]) {
                mark[x][y] ++;
            }
            if (graf[b] == 0) {
                if (cap[x][y] == flux[x][y]) {
                    if (b != f)
                        graf[b] = 1;
                }
                else{
                    if (b!= f){
                        vec[++dr] = b;
                        graf[b] = 1;
                    }
                }
            }
        }
    }
}
int main (void) {
    in >> n >> m;
    for (int i = 1; i <= m;i ++) {
        in >> a >> b >> c;
        v[a].push_back(b);
        v[b].push_back(a);
        cap[a][b] = c;
        cap[b][a] = c;
        ind [a][b] = i;
        ind [b][a] = i;
    }
    while (bfs()){
        for (int i = 0; i < v[n].size(); i ++) {
            int vecin = v[n][i];
            int minim = cap[vecin][n] - flux[vecin][n];
            int x = vecin;
            while (tata[x] not_eq 0) {
                minim = min (minim, cap[tata[x]][x]- flux[tata[x]][x]);
                x = tata[x];
            }
            x = vecin;
            while (tata[x] not_eq 0) {
                flux[tata[x]][x] += minim;
                flux[x][tata[x]] -= minim;
                x = tata[x];
            }
        }
    }
    solve_bfs (1,n,0);
    solve_bfs (n,1,1);
    for (int i = 1; i <= n; i ++) {
        for (int j = 1; j <= n; j ++) {
            if (mark[i][j] == 2) {
                rez [++k] = ind[i][j];
            }
        }
    }
    out << k <<"\n";
    for (int i = 1; i <= k; i ++){
        out << rez[i] <<"\n";
    }
    return 0;
}