Cod sursa(job #674184)

Utilizator feelshiftFeelshift feelshift Data 5 februarie 2012 19:23:49
Problema Ubuntzei Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
// http://infoarena.ro/problema/ubuntzei
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

const int oo = 0x3f3f3f3f;
const int MAX_SIZE = 2001;
const int MAX_FRIENDS = 16;

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

int nodes,edges,nrFriends,minLength = oo;
int matrix[MAX_SIZE][MAX_SIZE];
vector<int> friends;

void backtrack(int level);
bool stackValid(int level);
int pathLength();

int main() {
	in >> nodes >> edges >> nrFriends;

	int from,to;
	for(int i=1;i<=nrFriends;i++) {
		in >> from;
		friends.push_back(from);
	}

	for(int i=1;i<=edges;i++) {
		in >> from >> to;
		in >> matrix[from][to];
		matrix[to][from] = matrix[from][to];
	}

	for(int k=1;k<=nodes;k++)
		for(int i=1;i<=nodes;i++)
			for(int j=1;j<=nodes;j++)
				if(matrix[i][k] && matrix[k][j] && (!matrix[i][j] || matrix[i][j] > matrix[i][k] + matrix[k][j]) && i!=j)
					matrix[i][j] = matrix[i][k] + matrix[k][j];

	//nrFriends = 4;

	if(nrFriends) {
		do {
			minLength = min(minLength,pathLength());
		} while(next_permutation(friends.begin(),friends.end()));
		out << minLength << "\n";
	}
	else
		out << matrix[1][nodes] << "\n";

	return (0);
}

int pathLength() {
	int length = 0;

	length += matrix[1][friends.front()];
	for(int i=1;i<nrFriends;i++)
		length += matrix[friends[i-1]][friends[i]];
	length += matrix[friends.back()][nodes];

	return length;
}