Pagini recente » Cod sursa (job #1660042) | Cod sursa (job #1399709) | Cod sursa (job #621784) | Cod sursa (job #2459019) | Cod sursa (job #672967)
Cod sursa(job #672967)
// 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;
}