Cod sursa(job #1449748)

Utilizator timicsIoana Tamas timics Data 10 iunie 2015 15:28:54
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
int nr,sol[10100],e1[10100],e2[10100],flux,x,y,z,M,N,rez,c[1100][1100],f[1100][1100],q[1100],first,last,p[1100];
vector<int> m[1100];
bool viz[1100],viz2[1100];


inline bool bfs() {
    first = 0, last = 0;
    for(int i=1;i<=N;++i) {
        viz[i] = 0;
    }
    q[last++] = 1;
    viz[1] = 1;
    while(first < last) {
        int x = q[first++]; 
        if(x==N) {
            continue;
        }
        for(int i = 0; i < m[x].size(); ++i) {
            int y = m[x][i];
            if(!viz[y] && f[x][y] < c[x][y]) {
                q[last++] = y;
                viz[y]=1;
                p[y] = x;
            }
        }
    }
    return viz[N];
}

void bfs2(int s) {
    first = 0, last = 0;
    for(int i=1;i<=N;++i) {
        viz[i] = 0;
    }
    q[last++] = s;
    viz[s] = 1;
    while(first < last) {
        int x = q[first++]; 
        for(int i = 0; i < m[x].size(); ++i) {
            int y = m[x][i];
            if(!viz[y] && f[x][y] < c[x][y]) {
                q[last++] = y;
                viz[y]=1;
            }
        }
    }
}
void update_flow() {
    for(int i=0;i<m[N].size();++i) {
        int y = m[N][i];
        if(f[y][N] < c[y][N] && viz[y]) {
            p[N] = y;
            flux = 1100000000;
            int curr = N;
            while(p[curr]) {
                if(c[p[curr]][curr] - f[p[curr]][curr] < flux) {
                    flux = c[p[curr]][curr] - f[p[curr]][curr];
                } 
                if(!flux) {
                    break;
                }
                curr = p[curr];
            } 
            curr = N;
            while(p[curr]) {
                f[p[curr]][curr] += flux;
                f[curr][p[curr]] -= flux;
                curr = p[curr];
            }
            rez += flux;
        }
    }
}
  
int main() {
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;++i) {
        scanf("%d%d%d",&x,&y,&z);
        m[x].push_back(y);
        m[y].push_back(x);
        c[x][y] = z;
        c[y][x] = z;
        e1[i] = x;
        e2[i] = y;
    }
    while(true) {
        if(!bfs()) {
            break;
        }
        update_flow();
    }
    bfs2(N);
    for(int i=1;i<=N;++i) {
        viz2[i] = viz[i];
    }
    bfs2(1);
    for(int i=1;i<=M;++i) {
       x = e1[i], y = e2[i];
       if((viz[x] && viz2[y]) || (viz2[x] && viz[y])) {
       //if((viz[x] && viz2[y] && c[x][y]==f[x][y]) || (viz2[x] && viz[y] && c[y][x] == f[y][x])) {
            sol[++nr] = i;
       }
    }
    printf("%d\n",nr);
    for(int i=1;i<=nr;++i) {
        printf("%d\n",sol[i]);
    }
    return 0;
}