Cod sursa(job #672967)

Utilizator feelshiftFeelshift feelshift Data 3 februarie 2012 16:16:46
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
// http://infoarena.ro/problema/ubuntzei
#include <fstream>
#include <vector>
using namespace std;

#define cost first
#define indexx second

const int oo = 0x3f3f3f3f;
const int MAXSIZE = 2001;
const int MAXFRIENDS = 16;

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

int nodes,edges,nrFriends,minCost;
int stack[MAXFRIENDS];
int matrix[MAXSIZE][MAXSIZE];
int friends[MAXFRIENDS];

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 >> friends[i];

	/*nrFriends = 5;
	for(int i=1;i<=5;i++)
		friends.push_back(i);*/

	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][k] + matrix[k][j] || !matrix[i][j]) && i!=j)
					 matrix[i][j] = matrix[i][k] + matrix[k][j];

	/*for(int i=1;i<=nodes;i++) {
		for(int k=1;k<=nodes;k++)
			out << matrix[i][k] << " ";
		out << "\n";
	}*/

	minCost = oo;
	backtrack(1);

	out << minCost << "\n";

	return (0);
}

void backtrack(int level) {
	if(level <= nrFriends)
		for(int i=1;i<=nrFriends;i++) {
			stack[level] = friends[i];

			if(stackValid(level)) {
				if(level == nrFriends)
					/*for(int k=0;k<=level;k++)
						out << stack[k] << " ";
					out << "\n";*/
				minCost = min(minCost,pathLength());
			}

			//out << "Back!\n";
			backtrack(level+1);
		}
}

bool stackValid(int level) {
	for(int i=1;i<level;i++)
		for(int k=i+1;k<=level;k++)
			if(stack[i] == stack[k])
				return false;
	return true;
}

int pathLength() {
	int totalLength = 0;

	totalLength += matrix[1][stack[1]];
	for(int i=2;i<nrFriends;i++)
		totalLength += matrix[stack[i-1]][stack[i]];
	totalLength += matrix[stack[nrFriends]][nodes];

	return totalLength;
}