Cod sursa(job #1603037)

Utilizator nacrocRadu C nacroc Data 17 februarie 2016 09:40:08
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define NMAX 10005
#define inf 1<<28

using namespace std;

vector <int> G[NMAX], sol;
vector <pair <int, int> > v;
vector <int> :: iterator it;
queue <int> q;
int C[NMAX][NMAX], flux[NMAX][NMAX], viz1[NMAX], vizn[NMAX];
int tata[NMAX];
int N;

int bfs(){
    int nod;
    for(;!q.empty(); q.pop());
    memset(tata, 0, sizeof(tata));
    q.push(1);
    while(!q.empty()){
        nod = q.front();
        q.pop();
        for(it = G[nod].begin(); it != G[nod].end(); ++it)
            if(!tata[*it] && (C[nod][*it] > 0 || flux[nod][*it] > 0)){
                q.push(*it);
                tata[*it] = nod;
                if(*it == N) return 1;
            }
    }
    return 0;
}

void bfs1(){
    int nod;
    viz1[1] = 1;
    q.push(1);
    while(!q.empty()){
        nod = q.front();
        q.pop();
        for(it = G[nod].begin(); it != G[nod].end(); ++it)
            if(!viz1[*it] && (C[nod][*it] > 0 || flux[nod][*it] > 0)){
                viz1[*it] = 1;
                q.push(*it);
            }
    }
}

void bfsn(){
    int nod;
    vizn[N] = 1;
    q.push(N);
    while(!q.empty()){
        nod = q.front();
        q.pop();
        for(it = G[nod].begin(); it != G[nod].end(); ++it)
            if(!vizn[*it] && (C[nod][*it] > 0 || flux[nod][*it] > 0)){
                vizn[*it] = 1;
                q.push(*it);
            }
    }
}

int main(){
    freopen("critice.in", "r", stdin);
    freopen("critice.out", "w", stdout);
    int M, x, y, c, i, r;
    scanf("%d %d", &N, &M);
    for(int i = 1; i <= M; ++i){
        scanf("%d %d %d", &x, &y, &c);
        C[x][y] = C[y][x] = c;
        G[x].push_back(y);
        G[y].push_back(x);
        v.push_back(make_pair(x, y));
    }
    for(int fx = 0; bfs(); fx += r){
        r = inf;
        i = N;
        while(i != 1){
            if(C[tata[i]][i] > 0)
                r = min(r, C[tata[i]][i]);
            else r = min(r, flux[tata[i]][i]);
            i = tata[i];
        }
        i = N;
        while(i != 1){
            if(C[tata[i]][i] > 0){
                C[tata[i]][i] -= r;
                flux[i][tata[i]] += r;
            }else flux[tata[i]][i] -= r;
            i = tata[i];
        }
    }
    bfs1();
    bfsn();
    for(int i = 0; i < M; ++i)
        if(C[v[i].first][v[i].second] == flux[v[i].first][v[i].second] || C[v[i].second][v[i].first] == flux[v[i].second][v[i].first])
            if((viz1[v[i].first] && vizn[v[i].second]) || (viz1[v[i].second] && vizn[v[i].first]))
                sol.push_back(i);
    printf("%d\n", sol.size());
    for(it = sol.begin(); it != sol.end(); ++it)
        printf("%d\n", *it+1);
    return 0;
}