Cod sursa(job #695177)

Utilizator GodstormBotarleanu Robert Godstorm Data 28 februarie 2012 10:57:55
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<cstdio>
#include<iostream>
#define INT_MAX 99999
using namespace std;

FILE *fin=fopen("ubuntzei.in","r");
FILE *fout=fopen("ubuntzei.out","w");

int n,m,k,K[16],i,j,ct,cmin=INT_MAX;
int cost[2001][2001];
int x[17];
//clock_t start,stop;

int test(int k)
{
	for(int i=1;i<k;i++)
		if(x[i]==x[k]) return 0;
	return 1;
}
int bk(int k1)
{
	x[k1]=0;
	while(x[k1]<k)
		{
			x[k1]++;
			if(test(k1)){
							ct+=cost[K[x[k1-1]]][K[x[k1]]];
							if(k1==k) {
										/*for(int i=1;i<=k;i++)
											fprintf(fout,"%d ",K[x[i]]);
										fprintf(fout,"\n");*/
										cmin=min(cmin,ct+cost[1][K[x[1]]]+cost[K[x[k]]][n]);
									  }
							else bk(k1+1);
							ct-=cost[K[x[k1-1]]][K[x[k1]]];
						}
		}
}
							
int main()
{
	//start=clock();
	fscanf(fin,"%d%d%d",&n,&m,&k);
	for(i=1;i<=k;i++)
		fscanf(fin,"%d",&K[i]);
	for(i=1;i<=m;i++)
		{
			int x1,y1,ct;
			fscanf(fin,"%d%d%d",&x1,&y1,&ct);
			cost[x1][y1]=cost[y1][x1]=ct;
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(cost[i][j]==0 && i!=j) cost[i][j]=INT_MAX;
	for(int z=1;z<=n;z++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(cost[i][z]!=INT_MAX && cost[z][j]!=INT_MAX)
					if(cost[i][j]>cost[i][z]+cost[z][j])
						cost[i][j]=cost[i][z]+cost[z][j];
	/*for(i=1;i<=k;i++)
		fprintf(fout,"%d ",cost[1][K[i]]);*/
	if(k!=0){
	bk(1);
	fprintf(fout,"%d",cmin);}
	else fprintf(fout,"%d",cost[1][n]);
	//stop=clock();
	//cout<<"timp "<<(float)(stop-start)/CLK_TCK<<" sec\n";
}