Pagini recente » Cod sursa (job #637447) | Cod sursa (job #3268048) | Cod sursa (job #806683) | Cod sursa (job #1726108) | Cod sursa (job #1384143)
#include<fstream>
#include<queue>
#include<unordered_map>
using namespace std;
typedef int64_t var;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define INF (1<<28)
#define MAXK 16
#define MAXN 1001
struct Edge {
var n, c;
Edge(var n, var c) {
this->n = n;
this->c = c;
}
};
typedef Edge Node;
unordered_map<var, var> D[MAXN];
unordered_map<var, bool> INQ[MAXN];
var POI[MAXN];
vector<Edge> G[MAXN];
var n, k;
void bellman() {
queue<Node> Q;
var conf = 0;
if(POI[1]) conf |= (1 << (POI[1] - 1));
for(var i=1; i<=n; i++) {
for(var conf = 0; conf < (1<<k); conf ++)
D[i][conf] = INF;
}
D[1][conf] = 0;
Q.push(Node(1, conf));
while(!Q.empty()) {
var node = Q.front().n;
var conf = Q.front().c;
Q.pop();
INQ[node][conf] = 0;
for(auto e : G[node]) {
var newconf = conf;
if(POI[e.n]) {
newconf |= (1 << (POI[e.n]-1));
}
if(D[e.n][newconf] > D[node][conf] + e.c) {
D[e.n][newconf] = D[node][conf] + e.c;
if(!INQ[e.n][newconf]) {
Q.push(Node(e.n, newconf));
INQ[e.n][newconf] = 1;
}
}
}
}
}
int main() {
var m, a, b, c, t;
fin>>n>>m>>k;
for(var i=1; i<=k; i++) {
fin>>t;
POI[t] = i;
}
while(m--) {
fin>>a>>b>>c;
G[a].push_back(Edge(b, c));
G[b].push_back(Edge(a, c));
}
bellman();
fout<<D[n][(1<<k)-1];
return 0;
}