Cod sursa(job #928590)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 26 martie 2013 15:45:38
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <cstdio>
#include <string.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>
using namespace std;

#define Nmax 1005
#define Mmax 10005

vector <int> graf[Nmax];
queue <int> q;
int n, m, flow, r, k;
int c[Nmax][Nmax], f[Nmax][Nmax];
int t[Nmax], A[Mmax], B[Mmax], sursa[Nmax], dest[Nmax], sol[Mmax];

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(y);
        graf[y].push_back(x);
        A[i] = x;
        B[i] = y;
        c[x][y] += z;
        c[y][x] += z;
    }
    fclose(stdin);
}

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

void dfs(int node, int a[]){
    a[node] = 1;
    int i, v, size = graf[node].size();
    for(i = 0; i < size; ++i){
        v = graf[node][i];
        if(!a[v] && c[node][v] > f[node][v] && c[v][node] > f[v][node])
            dfs(v, 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];
        }

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

    return t[n];
}

void solve(){ // algoritmul lui dinic
    int v;
    while(bfs())
        for(int i = 0, size = graf[n].size(); i < size; ++i){
            v = graf[n][i];
            if(t[v]){
                r = c[v][n] - f[v][n];
                for(int j = v; j != 1; j = t[j])
                    r = min(r, c[t[j]][j] - f[t[j]][j]);
                f[v][n] += r;
                f[n][v] -= r;
                for(int j = v; j != 1; j = t[j]){
                    f[t[j]][j] += r;
                    f[j][t[j]] -= r;
                }
                flow += r;
            }
        }
    dfs(1,sursa);
    dfs(n, dest);
    for(int i = 1; i <= m; ++i)
        if((sursa[A[i]] && dest[B[i]]) || (dest[A[i]] && sursa[B[i]]))
            sol[k++] = i;
}

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

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

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

    return 0;
}