Pagini recente » Cod sursa (job #2728056) | Cod sursa (job #676847) | Cod sursa (job #478841) | Cod sursa (job #1376887) | Cod sursa (job #1623589)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
struct L {
int pos;
int ccrt;
bool operator<(const L &other) const {
return ccrt > other.ccrt;
}
L(int _pos, int _ccrt) {
pos = _pos;
ccrt = _ccrt;
}
L() {}
};
int N, M;
int K;
int pos[16];
int d[20][20];
vector<int> viz;
vector<vector<pair<int, int> > > con;
priority_queue<L> q;
void bfs(int start, int as) {
int i;
fill(viz.begin(), viz.end(), 0);
q.push(L(start, 1));
while(!q.empty()) {
L tmp, crt;
crt = q.top();
q.pop();
if(viz[crt.pos] == 0) {
viz[crt.pos] = crt.ccrt;
} else {
continue;
}
for(i = 0; i < con[crt.pos].size(); i++) {
if(viz[con[crt.pos][i].first] == 0) {
tmp = crt;
tmp.pos = con[crt.pos][i].first;
tmp.ccrt += con[crt.pos][i].second;
q.push(tmp);
}
}
}
d[as][0] = viz[0] - 1;
for(i = 1; i <= K; i++) {
d[as][i] = viz[pos[i]] - 1;
}
d[as][K + 1] = viz[N - 1] - 1;
}
int viz2[20][70001];
void dfs(int pos, int stare) {
int i;
for(i = 1; i <= K + 1; i++) {
if(i == K + 1 && stare == (1 << K) - 1) {
viz2[i][stare] = viz2[pos][stare] + d[pos][i];
} else if(i <= K && !(stare & (1 << (i - 1))) && (viz2[i][stare | (1 << (i - 1))] == 0 || viz2[i][stare | (1 << (i - 1))] == 0 > viz2[pos][stare] + d[pos][i])) {
int starenoua;
starenoua = stare | (1 << (i - 1));
viz2[i][starenoua] = viz2[pos][stare] + d[pos][i];
dfs(i, starenoua);
}
}
}
int main() {
int i, j;
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
scanf("%d %d", &N, &M);
scanf("%d", &K);
for(i = 1; i <= K; i++) {
scanf("%d", &pos[i]);
pos[i]--;
}
con.resize(N, vector<pair<int, int> >());
for(i = 1; i <= M; i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
a--;
b--;
con[a].push_back(make_pair(b, c));
con[b].push_back(make_pair(a, c));
}
viz.resize(N, 0);
bfs(0, 0);
bfs(N -1, K + 1);
for(i = 1; i <= K; i++) {
bfs(pos[i], i);
}
dfs(0, 0);
printf("%d\n", viz2[K + 1][(1 << K - 1)]);
return 0;
}