Pagini recente » Cod sursa (job #3221412) | Cod sursa (job #110570) | Cod sursa (job #775414) | Cod sursa (job #106617) | Cod sursa (job #1578400)
#include <fstream>
#include <cstring>
#include <vector>
#include <set>
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
const int INF = 2000000000;
int n, m, k, K[20], D[2010];
vector < pair < int, int > > V[2010], G[20];
int Cost[20][20], C[(1 << 17) + 10][20];
void Djikstra(int start_nod)
{
set < pair < int, int > > H;
memset(D, 127, sizeof(D));
H.insert( { 0, start_nod } );
D[start_nod] = 0;
while (!H.empty())
{
pair < int, int > nod = *H.begin();
H.erase(*H.begin());
for (vector < pair < int, int > > :: iterator it = V[nod.second].begin(); it != V[nod.second].end(); it ++)
{
if (nod.first + it->second < D[it->first])
{
H.erase( { D[it->first], it->first } );
D[it->first] = nod.first + it->second;
H.insert( { D[it->first], it->first } );
}
}
}
}
int main()
{
fin >> n >> m >> k;
for (int i = 1; i <= k; i ++) fin >> K[i];
for (int i = 1, x, y, c; i <= m; i ++)
{
fin >> x >> y >> c;
V[x].push_back( { y, c } );
V[y].push_back( { x, c } );
}
K[0] = 1;
K[k + 1] = n;
for (int i = 0; i <= k + 1; i ++)
{
Djikstra(K[i]);
for (int j = 0; j <= k + 1; j ++)
{
Cost[i][j] = D[K[j]];
}
}
k += 2;
for (int i = 1; i < (1 << k); i ++)
{
for (int j = 0; j < k; j ++)
{
C[i][j] = INF;
if (i & (1 << j))
{
for (int l = 0; l < k; l ++)
{
if (i & (1 << l))
{
C[i][j] = min(C[i][j], C[i ^ (1 << j)][l] + Cost[j][l]);
}
}
}
}
}
int sol = INF;
for (int i = 0; i < k; i ++)
{
sol = min(sol, C[(1 << k) - 1][0] + Cost[i][0]);
}
fout << sol << '\n';
fout.close();
return 0;
}