Cod sursa(job #55076)

Utilizator scapryConstantin Berzan scapry Data 26 aprilie 2007 12:48:35
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>

enum { maxn = 1024, maxe = 10001, inf = 0x3F3F3F3F };

int n;
int d[maxn][maxn], dorig[maxn][maxn], done[maxn][maxn];
int edge[maxn][maxn]; //which edge is it?
int e;
int ee[maxe][2];
int theflow;
int ans[maxe], w;

void maxflow()
{
	int i, maxi, maxf, toadd;
	bool v[maxn];
	int f[maxn];
	int prev[maxn];

	theflow = 0;

	while(true) //increase flow
	{
		memset(v, 0, sizeof(v));
		memset(f, 0, sizeof(f));
		f[0] = inf;

		while(true) //find augmenting path
		{
			//find best node to start with
			maxi = -1;
			maxf = 0;
			for(i = 0; i < n; i++)
				if(!v[i] && f[i] > maxf)
				{
					maxi = i;
					maxf = f[i];
				}

			if(maxi == -1) //Mordor
				return;
			if(maxi == n - 1) //path done
				break;
			assert(maxf != 0);

			//update neighbors
			v[maxi] = true;
			for(i = 0; i < n; i++)
				if(!v[i] && d[maxi][i])
				{
					toadd = std::min(maxf, d[maxi][i] - f[i]);

					if(f[i] < toadd)
					{
						assert(toadd >= 0);
						f[i] = toadd;
						prev[i] = maxi;
					}
				}
		}

		//update graph
		for(i = n - 1; i != 0; i = prev[i])
		{
			d[ prev[i] ][i] -= maxf;
			d[i][ prev[i] ] += maxf;

			assert(d[ prev[i] ][i] >= 0);

		}

		theflow += maxf;
	}

	//unreachable
}

int main()
{
	int i, tmp, oldflow;
	FILE *f = fopen("critice.in", "r");
	if(!f) return 1;

	fscanf(f, "%d%d", &n, &e);
	for(i = 0; i < e; i++)
	{
		fscanf(f, "%d%d%d", &ee[i][0], &ee[i][1], &tmp);
		ee[i][0]--;
		ee[i][1]--;

		d[ ee[i][0] ][ ee[i][1] ] = tmp;
		d[ ee[i][1] ][ ee[i][0] ] = tmp;
		edge[ ee[i][0] ][ ee[i][1] ] = i;
		edge[ ee[i][1] ][ ee[i][0] ] = i;
	}

	fclose(f);
	f = fopen("critice.out", "w");
	if(!f) return 1;

	memcpy(dorig, d, sizeof(d));
	maxflow();
	memcpy(done, d, sizeof(d));
	oldflow = theflow;

	return 1;

	for(i = 0; i < e; i++)
	{
		if(done[ ee[i][0] ][ ee[i][1] ] == 0 ||
		   done[ ee[i][1] ][ ee[i][0] ] == 0) //fully used
		{
			memcpy(d, dorig, sizeof(d)); //copies 1MB everytime
			d[ ee[i][0] ][ ee[i][1] ]++;
			d[ ee[i][1] ][ ee[i][0] ]++;

			maxflow();
			assert(theflow >= oldflow);
			if(theflow > oldflow)
			{
				assert(theflow == oldflow + 1);
				ans[w++] = i;
			}
		}
	}

	fprintf(f, "%d\n", w);
	for(i = 0; i < w; i++)
		fprintf(f, "%d\n", ans[i] + 1);

	fclose(f);
	return 0;
}