Cod sursa(job #586923)

Utilizator bucketdeathcube k. bucket Data 3 mai 2011 13:24:22
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const char iname[] = "ubuntzei.in";
const char oname[] = "ubuntzei.out";
const int  nmax = 2005;
const int  infinity = 199999999;

ifstream fin(iname);
ofstream fout(oname);

int n, m, k, i, oras[nmax], x, y, c, j, viz[nmax];
vector<pair<int, int> > Gr[nmax];
int minimul= 29029292, kate;
int RF[nmax][nmax], sol[nmax];

void afis()
{	
	int i;
	int sum = 0;
	sum = sum + RF[1][sol[1]];
	for(i = 1; i <= kate - 1; i ++)
		sum = sum + RF[sol[i]][sol[i + 1]];
	sum = sum + RF[sol[kate]][n];
	if(sum < minimul)
		minimul = sum;
}
	

void back(int pas)
{	
	int cineva;
	if(pas == kate + 1)
		afis();
	else
	{
		for(cineva = 1; cineva <= kate; cineva++)
			if(!viz[oras[cineva]])
			{
				viz[oras[cineva]] = 1;
				sol[pas] = oras[cineva];
				back(pas + 1);
				viz[oras[cineva]] = 0;
			}
	}
}

int main()
{
	fin >> n >> m;
	fin >> kate;
	for(i = 1; i <= kate; i ++)
		fin >> oras[i];
	for(i = 1; i <= n; i ++)
		for(j = 1; j <= n; j ++)
			if(i != j)
				RF[i][j] = infinity;
		
	for(i = 1; i <= m; i ++)
	{
		fin >> x >> y >> c;
		Gr[x].push_back(make_pair(y, c));
		Gr[y].push_back(make_pair(x, c));
		RF[x][y] = RF[y][x] = c;
	}
	
	
	for(k = 1; k <= n; k++)
		for(i = 1; i <= n; i++)
			for(j = 1; j <= n; j ++)
				RF[i][j] = min(RF[i][j], RF[i][k] + RF[k][j]);
	if(kate > 0)
		back(1);
	else
		minimul = RF[1][n];
	fout << minimul << "\n";
	return 0;
}