Cod sursa(job #353773)

Utilizator iulia609fara nume iulia609 Data 6 octombrie 2009 01:56:08
Problema Bibel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<stdio.h>
#define dim 131073
#define infinit 200000001
using namespace std;

int C[20][dim],n;//, D[dim];

struct vector
{
	int x, y;
};

/*int distanta(vector X, vector Y)
{ int d;

	d = (X.x - Y.x)*(X.x - Y.x) + (X.y - Y.y)*(X.y - Y.y);
	return d;	
}*/

int min(int a, int b)
{
	if(a < b) return a;
	return b;
}


vector V[dim],W[dim];

int main()
{ int i,j,t,c,d,a,b,n1, min1, min2, sol;

	FILE *f = fopen("bibel.in", "r");
	FILE *g = fopen("bibel.out", "w");
	
	
	
	
  c = 0; n1 = 1; 
  fscanf(f, "%d", &c);
  while(c != 2)     //citirea din fisier
	{
	//fscanf(f, "%d", &c);

	n = 0;
	while(c == 0)
		{
			n++;
			fscanf(f, "%d%d", &V[n].x, &V[n].y);
			fscanf(f, "%d", &c);
		}
	 if(c == 2) break;				
		
	  while(c == 1)
	 {
		//initializarea cu infinit
		for(i = 1; i <= n; i++)
			for(j = 0; j <= 1<<(n); j++)
				C[i][j] = infinit;
		
		for(i = 1; i <= n; i++)
			for(j = 1; j <= n1; j++)
				{
					d = (W[i].x - V[j].x)*(W[i].x - V[j].x) + (W[i].y - V[j].y)*(W[i].y - V[j].y);
					C[i][1<<(n-i)] = min(C[i][1<<(n-i)], d);// + D[i]);
				}
		
		//a = i&(1<<(n-j));
		
		for(i = 1; i <= n; i++)
			for(j = 0; j <= 1<<(n); j++)
				{a = j&(1<<(n-i));
				 if(a)
					for(t = 1; t <= n; t++)
					{
						b = j&(1<<(n-t));
						if(!b)
						{
							d = (V[i].x - V[t].x)*(V[i].x - V[t].x) + (V[i].y - V[t].y)*(V[i].y - V[t].y);
							C[b][t] = min(C[b][t], C[i][j] + d);						
						}
					}
				}
		min1 = min2 = infinit;
		sol = 0;
		for(i = 1; i <= n; i++)
		{
			W[i].x = V[i].x;
			W[i].y = V[i].y;
			
			for(j = 1; j <= (1<<n); j++)
			{
				if(C[i][j] != min1) sol += C[i][j];
				
				//if(C[i][j] < min1) min2 = min1, min1 = C[i][j];
				// else if(C[i][j] < min2) min2 = C[i][j];
				//n1 = n;
			}
			n1 = n;
		}
	 fprintf(g, "%d\n", sol);  
	 fscanf(f, "%d", &c);
	 }
    }	  
	fclose(f);
	fclose(g);
	return 0;
}