Cod sursa(job #1345356)

Utilizator smaraldaSmaranda Dinu smaralda Data 17 februarie 2015 15:58:16
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;

#define ITERATOR vector <int>::iterator
const int NMAX = 1010, INF = 2e9;

int n;
bool vis[NMAX], vis1[NMAX], vis2[NMAX];
int dad[NMAX], cap[NMAX][NMAX], flow[NMAX][NMAX], x[NMAX], y[NMAX], c[NMAX];
vector <int> graph[NMAX], sol;

bool bfs () {
    queue <int> q;
    int node;
    ITERATOR it;

    memset(vis, 0, sizeof(vis));
    memset(dad, 0, sizeof(dad));

    vis[1] = 1;
    q.push(1);
    while(!q.empty()) {
        node = q.front();
        q.pop();
        if(node == n)
            continue;

        for(it = graph[node].begin(); it != graph[node].end(); ++ it)
            if(!vis[*it] && flow[node][*it] < cap[node][*it]) {
                q.push(*it);

                dad[*it] = node;
                vis[*it] = 1;
            }
    }

    return vis[n];
}

int abs (int x) {
    return x < 0 ? -x : x;
}

void dfs1 (int node) {
    vis1[node] = 1;
   
    for(ITERATOR it = graph[node].begin(); it != graph[node].end(); ++ it)
        if(!vis1[*it] && cap[node][*it] > flow[node][*it]) 
            dfs1(*it);
}

void dfs2 (int node) {
    vis2[node] = 1;
    for(ITERATOR it = graph[node].begin(); it != graph[node].end(); ++ it)
        if(!vis2[*it] && cap[node][*it] > flow[node][*it])
            dfs2(*it);
}

int main() {
    freopen("critice.in", "r", stdin);
    freopen("critice.out", "w", stdout);
    int node, m, i, minFlow;
    ITERATOR it;

    scanf("%d%d", &n, &m);
    for(i = 1; i <= m; ++ i) {
        scanf("%d%d%d", &x[i], &y[i], &c[i]);

        cap[x[i]][y[i]] = cap[y[i]][x[i]] = c[i];
        graph[x[i]].push_back(y[i]);
        graph[y[i]].push_back(x[i]);
    }

    while(bfs()) {
        for(it = graph[n].begin(); it != graph[n].end(); ++ it) {
            if(!vis[*it])
                continue;
            
            dad[n] = *it;

            node = n;
            minFlow = INF;
            while(node != 1) {
                minFlow = min(minFlow, cap[dad[node]][node] - flow[dad[node]][node]);
                node = dad[node];
            }

            node = n;
            while(node != 1) {
                flow[dad[node]][node] += minFlow;
                flow[node][dad[node]] -= minFlow;
                node = dad[node];
            }
        }
    }
    
    dfs1(1);
    dfs2(n);

    for(i = 1; i <= m; ++ i)
        if((vis1[x[i]] && vis2[y[i]]) || (vis1[y[i]] && vis2[x[i]]))
            sol.push_back(i);

    printf("%d\n", sol.size());
    for(it = sol.begin(); it != sol.end(); ++ it)
        printf("%d\n", *it);
    return 0;
}