Cod sursa(job #1347426)

Utilizator andreiblaj17Andrei Blaj andreiblaj17 Data 18 februarie 2015 22:51:04
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define nmax 1005
#define mmax 10005

using namespace std;

ifstream fi("critice.in");
ofstream fo("critice.out");

struct muchie {
    int x, y;
} M[mmax];

int n, m;
vector <int> G[nmax], sol;

int c[nmax][nmax], f[nmax][nmax];
int t[nmax];
bool viz[nmax], viz1[nmax], viz2[nmax];

queue <int> q;

void read() {
    int x, y, z;
    fi >> n >> m;
    for (int i = 1; i <= m; i++) {
        fi >> x >> y >> z;
        M[i].x = x, M[i].y = y;
        c[x][y] = c[y][x] = z;
        G[x].push_back(y);
        G[y].push_back(x);
    }
}

int bfs() {
    
    for (int i = 1; i <= n; i++)
        viz[i] = 0;
    
    viz[1] = 1;
    q.push(1);
    
    while (!q.empty()) {
        int nod = q.front();
        q.pop();
        if (nod == n) continue;
        for (int i = 0; i < G[nod].size(); i++) {
            int vecin = G[nod][i];
            if (viz[vecin] || c[nod][vecin] == f[nod][vecin]) continue;
            t[vecin] = nod;
            viz[vecin] = 1;
            q.push(vecin);
        }
    }
    
    return viz[n];
}

void dfs(int nod) {
    viz[nod] = 1;
    for (int i = 0; i < G[nod].size(); i++) {
        int vecin = G[nod][i];
        if (!viz[vecin] && c[nod][vecin] > f[nod][vecin] && c[vecin][nod] > f[vecin][nod])
            dfs(vecin);
    }
}

int main() {
    
    read();
    
    int fMax = 0;
    
    while (bfs()) {
        for (int i = 0; i < G[n].size(); i++) {
            int vecin = G[n][i];
            if (!viz[vecin] || c[vecin][n] == f[vecin][n]) continue;
            t[n] = vecin;
            int fMin = 10005;
            for (int nod = n; nod != 1; nod = t[nod])
                fMin = min(fMin, c[t[nod]][nod] - f[t[nod]][nod]);
            if (fMin == 0) continue;
            for (int nod = n; nod != 1; nod = t[nod]) {
                f[t[nod]][nod] += fMin;
                f[nod][t[nod]] -= fMin;
            }
            fMax += fMin;
        }
    }
    
    memset(viz, 0, sizeof(viz));
    dfs(1);
    memcpy(viz1, viz, sizeof(viz));
    
    memset(viz, 0, sizeof(viz));
    dfs(n);
    memcpy(viz2, viz, sizeof(viz));
    
    for (int i = 1; i <= n; i++)
        if ((viz1[M[i].x] && viz2[M[i].y]) || (viz1[M[i].y] && viz2[M[i].x]))
            sol.push_back(i);
    
    fo << sol.size() << "\n";
    for (int i = 0; i < int(sol.size()); i++)
        fo << sol[i] << "\n";
    
    fi.close();
    fo.close();
    
    return 0;
}