Cod sursa(job #697562)

Utilizator munteanu_cristiMunteanu Cristi munteanu_cristi Data 29 februarie 2012 09:49:53
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<fstream>
#include<vector>
using namespace std;

#define inf 100001

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

int a[2000][2000],ub,n,m,d,dmin=500000,x[2000],k;
vector <int> c;

void initial()
{
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			a[i][j]=inf;
}

void citire()
{
	int i,x,y,z;
	fin>>n>>m>>ub;
	for(i=1;i<=ub;i++)
	{
		fin>>x;
		c.push_back(x);
	}
	initial();
	for(i=1;i<=m;i++)
	{
		fin>>x>>y>>z;
		a[x][y]=z;
		a[y][x]=z;
	}
	fin.close();
}

void afisare()
{
	fout<<dmin;
	fout.close();
}

void floyd()
{
	int i,j,k;
	for(k=1;k<=n;k++)
	{
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
			{
				if(a[i][k]!=inf&&a[k][j]!=inf)
				{
					if(a[i][j]>a[i][k]+a[k][j])
					{
						a[i][j]=a[i][k]+a[k][j];
					}
				}
			}
		}
	}
}
/*
void init(int k)
{
	x[k]=0;
}

int exista(int k)
{
	return (x[k]<ub);
}

int valid(int k)
{
	int i;
	for(i=1;i<k;i++)
	{
		if(x[i]==x[k]) 
			return 0;
	}
	return 1;
}

int solutie(int k)
{
	return (k==ub);
}

void suma()
{
	int i;
	d=a[1][c[x[1]]];
	for(i=1;i<ub;i++)
		d+=a[c[x[i]]][c[x[i+1]]];
	d+=a[c[x[ub]]][n];
	if(d<dmin)
		dmin=d;
}

void BKT()
{
	int k=1;
	init(k);
	while(k>=1)
	{
		if(exista(k))
		{
			x[k]=x[k]+1;
			if(valid(k))
			{
				if(solutie(k))
				{
					suma();
				}
				else
				{
					k++;
					init(k);
				}
			}
		}
		else
			k--;
	}
}
*/

void suma()
{
	int i;
	d=a[1][c[0]];
	for(i=0;i<c.size()-1;i++)
		d+=a[c[i]][c[i+1]];
	d+=a[c[ub-1]][n];
	if(d<dmin)
		dmin=d;
}

int main()
{
	citire();
	floyd();
	if(ub==0)
	{
		dmin=a[1][n];
	}
	else
	{
		//BKT();
		do
		{
			suma();
		}while(next_permutation(c.begin(),c.end()));
	}
	afisare();
	return 0;
}