Pagini recente » junior | vrfeijce | Cod sursa (job #204411) | Cod sursa (job #1264536) | Cod sursa (job #2170337)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>
#define NMAX 2001
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, k, c[NMAX], v[NMAX];
vector<pair<int, int>> g[NMAX];
void citire()
{
int m;
fin >> n >> m >> k;
for (int i = 1; i <= k; i++)
fin >> c[k];
for (int i = 1; i <= m; i++)
{
int x, y, z;
fin >> x >> y >> z;
g[x].push_back(make_pair(y, z));
g[y].push_back(make_pair(x, z));
}
fin.close();
}
void dijkstra(int x)
{
fill(v + 1, v + n + 1, INT_MAX);
v[x] = 0;
queue<int> q;
q.push(x);
bool inQ[NMAX];
fill(inQ + 1, inQ + n + 1, 0);
inQ[x] = 1;
while (!q.empty())
{
x = q.front();
q.pop();
inQ[x] = 0;
for(vector<pair<int,int>>::iterator i = g[x].begin(); i!=g[x].end(); i++)
if (v[i->first] > v[x] + i->second)
{
v[i->first] = v[x] + i->second;
if (inQ[i->first] == 0)
{
inQ[i->first] = 1;
q.push(i->first);
}
}
}
}
void solution()
{
int min;
int s = 0;
dijkstra(1);
int viz[NMAX];
fill(viz, viz + n + 1, 0);
v[0] = INT_MAX;
for (int j = 1; j <= k; j++)
{
min = 0;
for (int i = 1; i <= k; i++)
if (!viz[i] && v[c[i]] < v[c[min]]) min = i;
s = s + v[c[min]];
dijkstra(c[min]);
}
s = s + v[n];
fout << s;
fout.close();
}
int main()
{
citire();
solution();
return 0;
}