Cod sursa(job #697070)

Utilizator i.anna_mIlusca Ana-Maria i.anna_m Data 28 februarie 2012 21:57:42
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> ck(16);
int mat[2001][2001];
FILE *f,*g;
int main()
{
	f=fopen("ubuntzei.in","r");
	g=fopen("ubuntzei.out","w");
	int n,m,ka,a,b,c;
	fscanf(f,"%d%d%d",&n,&m,&ka);
	register int i,j,k;
	for(i=0;i<ka;++i)
		fscanf(f,"%d",&ck[i]);
	ck.resize(ka);
	for(i=0;i<m;i++)
	{
		fscanf(f,"%d%d%d",&a,&b,&c);
		mat[a][b]=c;
		mat[b][a]=c;
	}
	for(k=1;k<=n;++k)
		for(i=1;i<=n;++i)
			for(j=1;j<=n;++j)
				if(mat[i][k]!=0 && mat[k][j]!=0 && ( mat[i][j]>mat[i][k]+mat[k][j] || mat[i][j]==0) && i!=j)
					mat[i][j]=mat[i][k]+mat[k][j];
	int min=999999999,sum=0;
	if(ka>0)
	{
		sort(ck.begin(),ck.end());
		do
		{
			sum=mat[1][ck[0]]+mat[ck[ka-1]][n];
			for(i=0;i<ka-1;++i)
			{
				sum+=mat[ck[i]][ck[i+1]];
			}
			if(sum<min && sum!=0)
				min=sum;
		}while( next_permutation( ck.begin(),ck.end() ) );
	}
	else min=mat[1][n];
	fprintf(g,"%d",min);
	fclose(f);
	fclose(g);
	return 0;
}