Cod sursa(job #81630)

Utilizator peanutzAndrei Homorodean peanutz Data 3 septembrie 2007 15:35:42
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <stdio.h>
#include <memory.h>

#define NMAX 1002
#define MMAX 10002
#define INFI 0x3f3f3f3f

int cap[NMAX][NMAX];
int n, m;
int flux;
int a[MMAX], b[MMAX];
int source, sink;

void read()
{
	int i;
	int c;
	scanf("%d%d", &n, &m);
	for(i = 1; i <= m; ++i)
	{
		scanf("%d%d%d", &a[i], &b[i], &c);
		cap[a[i]][b[i]] = c;
        cap[b[i]][a[i]] = c;
	}
	source = 1, sink = n;
}

#define MIN(a, b) ((a) < (b)) ? (a) : (b)

int bf(short type)
{
	int i, x;
	int q[NMAX], t[NMAX];
        short uz[NMAX], ok = 1;
	int inc, sf;
	
	memset(uz, 0, sizeof(uz));

	inc = sf = 1;
	q[1] = source;
	++uz[source];

	while(inc <= sf && ok)
	{
		x = q[inc++];

		for(i = source; i <= sink; ++i)
		{
			if(cap[x][i] && !uz[i])
			{
				++uz[i];
				q[++sf] = i;
				t[i] = x;
				
				ok -= (i == sink);
			}
		}
	}
	if(!uz[sink])
		return 0;
    if(type)
        return 1;

	int min = INFI;
	for(i = sink; i != source; i = t[i])
		min = MIN(min, cap[ t[i] ][i]);

	for(i = sink; i != source; i = t[i])
		cap[ t[i] ][i] -= min, cap[i][ t[i] ] += min;

	return min;
}

int fk()
{
	int f = 0, aux;

	while(1)
	{
		aux = bf(0);
		if(!aux)
			return f;
		f += aux;
	}
	return f;
}
		
int main()
{
	freopen("critice.in", "r", stdin);
	freopen("critice.out", "w", stdout);

	read();

	flux = fk();
	//printf("%d\n", flux);

	printf("            \n");
    int nr = 0;
	for(int i = 1; i <= m; ++i)
	{
		if(!cap[ a[i] ][ b[i] ] || !cap[ b[i] ][ a[i] ])
		{
			++cap[ a[i] ][ b[i] ];
            ++cap[ b[i] ][ a[i] ];
			if(bf(1))
				printf("%d\n", i), ++nr;
			--cap[ a[i] ][ b[i] ];
            --cap[ b[i] ][ a[i] ];
		}
	}
    fseek(stdout, 0, SEEK_SET);
    printf("%d", nr);

	return 0;
}