Pagini recente » Cod sursa (job #3032544) | Cod sursa (job #1098664) | Cod sursa (job #422087) | Cod sursa (job #2562550) | Cod sursa (job #1246570)
/// Craciun Catalin
/// Ubuntzei
/// OJI2011
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
// #define DBG 1
#define NMax 2005
#define INF 0xffffff
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k;
long long pathLen = 0;
vector<int> Nodes;
int V[NMax][NMax]; /// Matricea costurilor
void read() {
f>>n>>m;
f>>k;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
V[i][j] = INF;
for (int i=1;i<=k;i++) {
int x;
f>>x;
Nodes.push_back(x);
}
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();
}
int djkastra(int begin, int end) {
int d[NMax], father[NMax], k, minim;
bool ok = true, visited[NMax];
for (int i=1;i<=n;i++) {
d[i] = V[begin][i];
visited[i] = 0;
father[i] = begin;
}
visited[begin] = 1;
father[begin] = 0;
while (ok) {
minim = INF;
for (int i=1;i<=n;i++) {
if (!visited[i] && minim > V[begin][i]) {
minim = V[begin][i];
k = i;
}
}
if (minim != INF) {
visited[k] = 1;
for (int i=1;i<=n;i++) {
if (!visited[i] && d[i] > d[k] + V[k][i]) {
d[i] = d[k]+V[k][i];
father[i] = k;
}
}
} else
ok = false;
}
if (d[end] == INF)
return 0;
return d[end];
}
void solve() {
for (int i=0;i<Nodes.size()-1;i++) {
pathLen += djkastra(Nodes[i], Nodes[i+1]);
}
}
int main() {
Nodes.push_back(1);
read();
Nodes.push_back(n);
solve();
g<<pathLen<<'\n';
g.close();
return 0;
}