Cod sursa(job #927516)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 25 martie 2013 20:47:17
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <cstdio>
#include <string.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>
using namespace std;

typedef pair <int, int> pereche;

#define Nmax 1000
vector <pereche> graf[Nmax];
queue <int> q;
int n, m, flow, r, k, unic, poz, minn;
int c[Nmax][Nmax], f[Nmax][Nmax];
bool sol[Nmax];
pereche t[Nmax];

void read(){
    int x, y, z;
    scanf("%i %i", &n, &m);
    for(int i = 1; i <= m; ++i){
        scanf("%i %i %i", &x, &y, &z);
        graf[x].push_back(pereche(y,i));
        graf[y].push_back(pereche(x,i));
        c[x][y] += z;
        c[y][x] += z;
    }
    fclose(stdin);
}

inline int min(int a, int b){
    if(a > b) return b;
    return a;
}

int bfs(){
    int u, v;
    memset(t, 0, sizeof(t));
    q.push(1);

    while(!q.empty()){
        u = q.front();
        q.pop();

        if(u == n){
            while(!q.empty()) q.pop();
            return t[n].first;
        }

        for(int i = 0, size = graf[u].size(); i < size; ++i){
            v = graf[u][i].first;
            if(t[v].first == 0 && c[u][v] != f[u][v]){
                t[v] = pereche(u, graf[u][i].second);
                q.push(v);
            }
        }
    }

    return t[n].first;
}

void solve(){ // algoritmul lui dinic
    int v;
    while(bfs())
        for(int i = 0, size = graf[n].size(); i < size; ++i){
            v = graf[n][i].first;
            if(t[v].first && c[v][n] != f[v][n]){
                r = c[v][n] - f[v][n];
                unic = 1;
                minn = r;
                poz = graf[n][i].second;
                for(int j = v; j != 1; j = t[j].first){
                    r = min(r, c[t[j].first][j] - f[t[j].first][j]);
                    if(r < minn){
                        unic = 1;
                        minn = r;
                        poz = t[j].second;
                    }
                    else if(r == minn)
                        unic = 0, k++;
                }
                if(unic) sol[poz] = 1;
                f[v][n] += r;
                f[n][v] -= r;
                for(int j = v; j != 1; j = t[j].first){
                    f[t[j].first][j] += r;
                    f[j][t[j].first] -= r;
                }

            }
        }
}

void print(){
    printf("%i\n", k);
    for(int i = 1; i <= n; ++i)
        if(sol[i]) printf("%i\n", i);
    fclose(stdout);
}

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

    read();
    solve();
    print();

    return 0;
}