Pagini recente » Cod sursa (job #2460684) | Cod sursa (job #2462133) | Cod sursa (job #607010) | Cod sursa (job #75473) | Cod sursa (job #2566218)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
#define mp make_pair
const int NMAX=2005, Infinity=1<<29;
typedef pair < int, int > PAIR;
int n, m, K, Dist[NMAX], Friends[NMAX], iteration, COST;
vector < PAIR > Edge[NMAX];
bitset < NMAX > Seen, Viz;
priority_queue < pair < int, int > > Q;
void Read()
{
int x, y, c;
ios::sync_with_stdio(false);
in.tie(NULL);
in >> n >> m >> K;
for(int i = 1; i <= K; i++)
in >> Friends[i];
for(int i = 1; i <= m; i++)
in>> x >> y >> c, Edge[x].push_back(mp(y, c)), Edge[y].push_back(mp(x, c));
}
void Dijkstra(int x)
{
Q.push(mp(0, x));
while(!Q.empty())
{
x = Q.top().second;
Q.pop();
if(!Seen[x])
{
for(PAIR it : Edge[x])
if(it.second + Dist[x] < Dist[it.first])
Dist[it.first] = Dist[x] + it.second, Q.push(mp(-Dist[it.first], it.first));
Seen[x]=1;
}
}
}
int main()
{
Read();
int Position = 1;
iteration = 1;
int Min, p;
while(iteration <= K)
{
for(int i = 1; i<=n; i++)
Seen[i] = 0, Dist[i] = Infinity;
Dist[Position] = 0;
Dijkstra(Position);
Min = Infinity;
for(int i = 1; i<= K; i++)
if(!Viz[Friends[i]] && Dist[Friends[i]] < Min)
Min = Dist[Friends[i]], p = i;
COST += Min;
Viz[Friends[p]] = 1;
iteration++;
Position = Friends[p];
}
for(int i = 1; i<=n; i++)
Seen[i] = 0, Dist[i] = Infinity;
Dist[Position] = 0;
Dijkstra(Position);
out << COST + Dist[n];
return 0;
}