Cod sursa(job #698543)

Utilizator soriynSorin Rita soriyn Data 29 februarie 2012 14:45:31
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<cstdio>
#include<algorithm>
#define maxn 2005

using namespace std;
int n,m,p;
int minim=1<<30;
int st[17];
int cost[maxn][maxn];
void read()
{
	freopen("ubuntzei.in","r",stdin);
	scanf("%d %d",&n,&m);
	scanf("%d",&p);
	for(int i=1;i<=p;i++)
		scanf("%d",&st[i]);
	int x,y,z;
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d %d",&x,&y,&z);
		cost[x][y]=z;
		cost[y][x]=z;
	}
}

void royfloyd()
{
	int k,i,j;
	for(k=1;k<=n;k++)
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				if( (cost[i][k]!=0)&&(cost[k][j]!=0)&&(cost[i][j]>cost[i][k]+cost[k][j]||cost[i][j]==0) && i!=j)
					cost[i][j]=cost[i][k]+cost[k][j];
}

void solve()
{
	int d=0;
	sort(st+1,st+p+1);
	do
	{
		d=0;
		d+=cost[1][st[1]];
		d+=cost[st[p]][n];
		for(int i=2;i<=p;i++)
			d+=cost[st[i-1]][st[i]];
		if(d<minim) minim=d;
	}while(next_permutation(st+1,st+p+1));
}

int main()
{
	freopen("ubuntzei.out","w",stdout);
	read();
	royfloyd();
	solve();
	if(p==0) minim=cost[1][n];
	printf("%d",minim);
}