Cod sursa(job #633109)

Utilizator yonutixMihai Cosmin yonutix Data 12 noiembrie 2011 22:51:40
Problema Traseu Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include<stdio.h>
class graph{
public:
	int *a, 
		*b, 
		*d, 
		n, 
		m,
		finalDim;
	graph(int mc, int nc)
	{
		a = new int[mc];
		b = new int[mc];
		d = new int[mc];
		n = nc;
		m = mc;
		finalDim = 0;
	}
	~graph()
	{
		delete a;
		delete b;
		delete d;
	}
	int grad(int x)
	{
		int g = 0;
		for(int i = 0; i < m; i++)
			if(a[i] == x || b[i] == x)
				g++;
		return g;
	}
	void deleteNode(int x)
	{
		int poz1 = 0, poz2 = 0;
		for(int i = 0; i < m; i++)
			if(poz1 == 0)
			{
				if(a[i] == x || b[i] == x)
					poz1 = i;
			}
			else
			{
				if(a[i] == x || b[i] == x)
					poz2 = i;
			}

			if(a[poz1] == x && a[poz2] == x)
				a[poz1] = b[poz2];

			if(b[poz1] == x && a[poz2] == x)
				b[poz1] = b[poz2];

			if(b[poz1] == x && b[poz2] ==x)
				b[poz1] = a[poz2];

			if(a[poz1] == x && b[poz2] == x)
				a[poz1] = a[poz2];

			d[poz1] += d[poz2];

			for(int i = poz2; i< m-1; i++)
			{
				a[i] = a[i+1];
				b[i] = b[i+1];
				d[i] = d[i+1];
			}
			m--;
	}
	void distance()
	{
		int min =20000,dis=0;
		bool h=true;
		while(h)
		{
			h = false;
			int nr = 0;
			int sum = 0;
			int min = 0;
			int auxa = -1,auxb = -1;
			bool ok = true;

			for(int i= 0; i < m; i++)
			{
				if(a[i] == b[i] && d[i] != 0 ) 
				{
					finalDim += d[i];
					d[i]=0;
				}
				if((a[i] != 0 || b[i] != 0 )&& ok == true)
				{
					nr++;
					sum+=d[i];
					min=d[i];
					auxa=a[i];
					auxb=b[i];
					a[i]=b[i]=d[i]=0;
					ok=false;
					h=true;
				}
				if(((a[i] == auxa && b[i] == auxb) || (a[i] == auxb && b[i] == auxa))&& ok == false)
				{
					nr++;
					sum+=d[i];
					if(d[i] < min) min=d[i];
					a[i]=b[i]=d[i]=0;
				}
			}
			if( nr % 2 == 0 && nr != 0) finalDim += sum;
			if(nr % 2 == 1 && nr != 0) finalDim += sum+min;
		}
	}
};

int main()
{
	graph *g;
	int n,m;
	FILE *f=fopen("traseu.in", "r"), *h = fopen("traseu.out","w");
	fscanf(f, "%d", &n);
	fscanf(f, "%d", &m);
	g = new graph(m,n);
	for(int i = 0; i < m; i++)
	{
		fscanf(f, "%d %d %d", &g->a[i], &g->b[i], &g->d[i]);
		g->a[i]--;
		g->b[i]--;
	}
	for(int i = 0; i< g->n; i++)
		if(g->grad(i) == 2) 
		{
			g->deleteNode(i);
			i--;
		}
		g->distance();
		fclose(f);
		fprintf(h,"%d", g->finalDim);
		fclose(h);
		delete g;
		return 0;
}