Cod sursa(job #874231)

Utilizator mcip1977Muresan Ciprian mcip1977 Data 8 februarie 2013 00:02:06
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int maxx=100000;
int a[2001][2001],k,n,m,p[2001],x[2001],l[2001],dmin=1000000000;
void citire()
{
	int i,j,x,c;
	fin>>n>>m>>k;
	for(i=1;i<=k;i++) fin>>l[i];
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
			a[i][j]=a[j][i]=maxx;
	for(x=1;x<=m;x++)
	{  fin>>i>>j>>c;
	   a[i][j]=c;
	   a[j][i]=c;
	}
}

void rf()
{
	int i,j,k;
	for(k=1;k<=n;k++)
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				if(i!=j)
					if(a[i][j]>a[i][k]+a[k][j])
						a[i][j]=a[i][k]+a[k][j];
}

void afis()
{
	int i,j;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
			if(a[i][j]!=maxx) fout<<a[i][j]<<" ";
		    else fout<<"# ";
		fout<<"\n";
	}
}

void calcul()
{
    int dist=a[1][l[x[1]]],i;
    for(i=2;i<=k;i++)
        dist=dist+a[l[x[i-1]]][l[x[i]]];
    dist=dist+a[l[x[k]]][n];
    if(dist<dmin) dmin=dist;
}

void perm(int n, int k)
{  for(int i=1;i<=n;i++)
     if(!p[i])
        { x[k]=i;
          p[i]=1;
          if(k==n) calcul();
          else perm(n,k+1);
          p[i]=0;
          }
}

int main()
{
	citire();
	rf();
	if(k>0) perm(k,1);
	else dmin=a[1][n];
	//fis();
	fout<<dmin;
	fin.close();
	fout.close();
	return 0;
}