Cod sursa(job #680301)

Utilizator noobakafloFlorin eu noobakaflo Data 15 februarie 2012 13:32:01
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;

#define MAX_N 2001
#define INF 999999

int n,m,k,d[MAX_N][MAX_N];
vector<int> prieteni;

void init(void)
{
	int i,j;
	for(i=0; i<n; i++)
		for(j=0; j<n; j++)
			d[i][j]=INF;
	for(i=0; i<n; i++)
		d[i][i]=0;
}

void read(void)
{
	int i,x,y,c;
	freopen("ubuntzei.in","r",stdin);
	scanf("%d %d %d",&n,&m,&k);
	for(i=1; i<=k; i++)
	{
        scanf("%d ",&x);
		x--;
		prieteni.push_back(x);
	}
	
	init();	
	for(i=1; i<=m; i++)
	{
		scanf("%d %d %d",&x,&y,&c);
		x--; y--;
		d[x][y]=c; d[y][x]=c;
	}
}

void roy_floyd(void)
{
	int k,i,j;
	for(k=0; k<n; k++)
		for(i=0; i<n; i++)
			for(j=0; j<n; j++)
				if(d[i][j]>d[i][k]+d[k][j])
					d[i][j]=d[i][k]+d[k][j];
}

int solve(void)
{
	if(k>0) 
	{
		int i,start=0,final=n-1,temp,answer=INF;
		sort(prieteni.begin(),prieteni.end());
		do
		{
			temp=d[start][prieteni.front()]+d[prieteni.back()][final];
			for(i=0; i<k-1; i++)
				temp+=d[prieteni[i]][prieteni[i+1]];
			answer=min(temp,answer);
		}while(next_permutation(prieteni.begin(),prieteni.end()));
		return answer;
	}
	else
		return d[0][n-1];
}

void write(void)
{
	freopen("ubuntzei.out","w",stdout);
	printf("%d ",solve());
}

int main()
{
	read(); 
	roy_floyd();
	write();
	return 0;
}