Pagini recente » Cod sursa (job #1111695) | Cod sursa (job #425450) | Cod sursa (job #526783) | Cod sursa (job #3241984) | Cod sursa (job #2566727)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
#define mp make_pair
typedef pair < int, int > PAIR;
const int NMAX = 2005, Infinity = 1<<29;
int n, m, K, Friends[16], MIN, N, Dist[20][20], D[NMAX];
priority_queue < PAIR > Q;
vector < PAIR > Edge[NMAX];
bitset < NMAX > Seen;
bitset < 30 > Used;
void BKT(int k, int SUM, int PredFriend)
{
if(k == K + 1 && SUM + Dist[PredFriend+1][K+1] < MIN)
MIN = SUM + Dist[PredFriend+1][K+1];
else
{
for(int i=1; i<=K; i++)
if(!Used[i])
{
Used[i] = 1;
int s = Dist[PredFriend+1][i] + SUM;
if(s < MIN)
BKT(k+1, s, i);
Used[i] = 0;
}
}
}
void Read()
{
int x, y, c;
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(D[x] + it.second < D[it.first])
D[it.first] = D[x] + it.second, Q.push(mp(-D[it.first], it.first));
Seen[x] = 1;
}
}
}
int main()
{
Read();
for(int i = 1; i <= K; i++)
{
for(int j = 1; j <=n; j++)
D[j] = Infinity, Seen[j] = 0;
D[Friends[i]] = 0;
Dijkstra(Friends[i]);
Dist[1][i] = D[1];
K++;
for(int j = 2; j <= K; j++)
Dist[j][i] = D[Friends[j-1]];
K--;
Dist[i+1][i] = Infinity;
}
for(int j = 1; j <=n; j++)
D[j] = Infinity, Seen[j] = 0;
D[n] = 0;
Dijkstra(n);
K++;
Dist[1][K] = D[1];
for(int i = 2; i<=K; i++)
Dist[i][K] = D[Friends[i-1]];
K--;
MIN = 1<<30;
if(K == 0)
{
out << Dist[1][1];
return 0;
}
for(int i = 1; i <= K; i++)
Used[i] = 1, BKT(2, Dist[1][i], 1), Used[i] = 0;
out << MIN;
return 0;
}