Cod sursa(job #627051)

Utilizator sebii_cSebastian Claici sebii_c Data 28 octombrie 2011 21:51:50
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

#define NMAX 1010
#define MMAX 10010
#define INF (1<<20)

vector< pair<int, int> > edge;
vector<int> A[NMAX];
int F[NMAX][NMAX], C[NMAX][NMAX], from[NMAX], viz[NMAX][2], Q[NMAX];
int rez[MMAX];
int N, M, tail, head;

inline int min(int a, int b)
{
    return (a<b)?a:b;
}

void read()
{
    int x, y, i, cost;
    scanf("%d %d", &N, &M);
    for (i=1; i<=M; ++i) {
	scanf("%d %d %d", &x, &y, &cost);
	edge.push_back(make_pair(x, y));
	A[x].push_back(y);
	A[y].push_back(x);
	C[x][y] = C[y][x] = cost;
    }
}

int BFS()
{
    int i, V;
    head = tail = 0;
    Q[head++] = 1;
    while (tail < head) {
	int node = Q[tail++];
	if (node == N)
	    continue;
	for (i=0; i<A[node].size(); ++i) {
	    V = A[node][i];
	    if (!from[V] && (C[node][V] - F[node][V]) > 0) {
		from[V] = node;
		Q[head++] = V;
	    }
	}
    }
    return from[N];
}

void flux()
{
    int i, j, V;
    memset(from, 0, sizeof(from));
    while (BFS()) {
	for (i=0; i<A[N].size(); ++i) {
	    V = A[N][i];
	    if ((C[N][V] - F[N][V]) > 0 && from[V]) {
		from[N] = V;
		int flux = INF;

		for (j=N; j > 1; j=from[j]) 
		    flux = min(flux, C[from[j]][j] - F[from[j]][j]);
		for (j=N; j > 1; j=from[j]) {
		    F[from[j]][j] += flux;
		    F[j][from[j]] -= flux;
		}
	    }
	}
	memset(from, 0, sizeof(from));
    }
}

void bfs(int start, int end, int st)
{
    tail = head = 0;
    viz[start][st] = 1;
    Q[head++] = start;
    while (tail < head) {
	int node = Q[tail++];
	if (node == end)
	    break;
	vector <int>::iterator it;
	for (it = A[node].begin(); it != A[node].end(); ++it) {
	    if (!viz[*it][st]) {
		if (F[*it][node] < C[*it][node] && F[node][*it] < C[node][*it]) { 
		    viz[*it][st] = 1;
		    Q[head++] = *it;
		}
	    }
	}
    }
}

int main()
{
    int i, size = 0;
    freopen("critice.in", "r", stdin);
    freopen("critice.out", "w", stdout);
    read();
    flux();
    bfs(1, N, 0);
    bfs(N, 1, 1);
    
    for (i=0; i<M; ++i) {
	int x = edge[i].first;
	int y = edge[i].second;
	if (F[x][y] == C[x][y]) {
	    
	    if ((viz[x][0] && !viz[y][0]) && (!viz[x][1] && viz[y][1])) {
		rez[++size] = i+1;
		continue;
	    }
	}
	if (F[y][x] == C[y][x])
	    if ((!viz[x][0] && viz[y][0]) && (viz[x][1] && !viz[y][1]))
		rez[++size] = i+1;
    }
    printf("%d\n", size);
    for (i=1; i<=size; ++i)
	printf("%d\n", rez[i]);
    return 0;
}