Cod sursa(job #671949)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 1 februarie 2012 10:43:14
Problema Ubuntzei Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <limits>
using namespace std;
ofstream fout("ubuntzei.out");
int fr[16],v[16],a[2001][2001],n,m,k,d[2001],coada[2001],viz[2001],sol[16],smin=2000000000;
void afis()
{
	int s=0;
	for(int i=0;i<k;i++)
		s+=a[sol[i]][sol[i+1]];
	s+=a[sol[k]][n];
	if(s<smin) smin=s;
}
void init()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i==j) a[i][j]=0;
		else a[i][j]=1000000001;
}
void citire()
{
	freopen ("ubuntzei.in","r",stdin);
	scanf("%d%d%d", &n,&m,&k);
	for(int i=1;i<=k;i++)
		scanf("%d",&v[i]);
	init();
	for(int i=1;i<=m;i++)
	{
		int x,y,s;
		scanf("%d%d%d",&x,&y,&s);
		a[x][y]=a[y][x]=s;
	}
	
}
/*int dijktra(int x,int y)
{
	coada[1]=x;
	viz[x]=1;
	int dr=1,s=1;
	do{
		for(int i=1;i<=n;i++)
			if(a[coada[s]][i]!=0 && d[i]==0 && viz[i]==0)
			{
				viz[i]=1;
				d[i]=d[coada[s]]+a[coada[s]][i];
				coada[++dr]=i;
			}
			else if(a[coada[s]][i]!=0 && d[coada[s]]+a[coada[s]][i]<d[i])
				d[i]=d[coada[s]]+a[coada[s]][i];
		s+=1;
	}while(s<=dr);
	return d[y];
}*/
void fw()
{
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(a[i][k]+a[k][j]<a[i][j]) 
					a[i][j]=a[i][k]+a[k][j];
}
void back(int k2)
{
	if(k2>k) afis();
	else
		for(int i=1;i<=k;i++)
			if(fr[v[i]]==0)
			{
				sol[k2]=v[i];
				fr[v[i]]=1;
				back(k2+1);
				fr[v[i]]=0;
			}
}
int main()
{
	citire();
	fw();
	sol[0]=1;
	back(1);
	fout<<smin<<" ";
	return 0;
}