Cod sursa(job #581179)

Utilizator maritimCristian Lambru maritim Data 13 aprilie 2011 21:02:14
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h>
#include<vector>

#define INF 10000

int A[2001][2001];
int N;
int M;
int K;
int V[16];
short int viz[16];
int Oras[16];
int MIN = 100000;

void initializare(void)
{
	for(int i=1;i<=N;i++)
		memset(A[i],INF,sizeof(A[0]));
}

void citire(void)
{
	int a;
	int b;
	int c;
	FILE *f = fopen("ubuntzei.in","r");
	
	fscanf(f,"%d %d",&N,&M);
	initializare();
	fscanf(f,"%d ",&K);
	for(int i=1;i<=K;i++)
	{
		fscanf(f,"%d ",&a);
		Oras[i] = a;
	}
	for(int i=1;i<=M;i++)
	{
		fscanf(f,"%d %d %d",&a,&b,&c);
		A[a][b] = c;
		A[b][a] = c;
	}
	
	fclose(f);
}

void royfloyd(void)
{
	for(int k=1;k<=N;k++)
		for(int i=1;i<=N;i++)
			for(int j=1;j<=N;j++)
				if(A[i][j]>A[i][k]+A[k][j])
					A[i][j] = A[i][k] + A[k][j];
}

void calcmax(void)
{
	long long sum = A[1][Oras[V[1]]] + A[N][Oras[V[K]]];
	for(int i=1;i<K;i++)
		sum += A[Oras[V[i]]][Oras[V[i+1]]];
	if(MIN>sum)
		MIN = sum;
}

void back(int k)
{
	if(k == K+1)
		calcmax();
	else
	{
	for(int i=1;i<=K;i++)
		if(!viz[i])
		{
			V[k] = i;
			viz[i] = 1;
			back(k+1);
			viz[i] = 0;
		}
	}
}

void calc(void)
{
	FILE *f = fopen("ubuntzei.out","w");

	if(!K)
		fprintf(f,"%d ",A[1][N]);
	else
	{
		back(1);
		fprintf(f,"%d ",MIN);
	}

	fclose(f);
}

int main()
{
	citire();
	royfloyd();
	calc();
	
	return 0;
}