Pagini recente » Cod sursa (job #3244187) | Cod sursa (job #1575841) | Cod sursa (job #459857) | Cod sursa (job #1826346) | Cod sursa (job #1246011)
/// Craciun Catalin
/// Ubuntzei
/// OJI2011
#include <iostream>
#include <fstream>
#include <climits>
#include <cstring>
#include <vector>
// #define DBG 1
#define NMax 2005
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k;
int C[NMax];
int Visited[NMax];
int minim = INT_MAX;
int pathLen = 0;
int V[NMax][NMax]; /// Matricea costurilor
void read() {
f>>n>>m;
f>>k;
memset(C, 0, sizeof(C));
memset(Visited, 0, sizeof(Visited));
for (int i=1;i<=k;i++) {
int x;
f>>x;
C[x] = 1;
}
for (int i=1;i<=m;i++) {
int x, y, len;
f>>x>>y>>len;
V[x][y] = len;
//V[y][x] = len;
}
f.close();
}
/// DFS
void reachedDest() {
bool eligiblePath = true;
for (int i=1;i<=n && eligiblePath;i++) {
if (C[i] == 1 && Visited[i] != 1)
eligiblePath = false;
}
if (eligiblePath) {
if (minim > pathLen)
minim = pathLen;
}
}
void dfs(int k) {
if (k == n) {
reachedDest();
}
for (int i=k+1;i<=n;i++) {
if (V[k][i] != 0) {
#ifdef DBG
cout<<"going to "<<i<<endl;
#endif // DBG
Visited[i] = 1;
pathLen += V[k][i];
dfs(i);
#ifdef DBG
cout<<"leaving from "<<i<<endl;
#endif // DBG
Visited[i] = 0;
pathLen -= V[k][i];
}
}
}
int main() {
read();
Visited[1] = 1; pathLen = 0;
dfs(1);
g<<minim<<'\n';
g.close();
return 0;
}