Pagini recente » Cod sursa (job #872414) | Cod sursa (job #622668) | Cod sursa (job #834320) | Cod sursa (job #2068294) | Cod sursa (job #1640807)
using namespace std;
#include <fstream>
#include <vector>
#include <queue>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define Nmax 2001
#define Kmax 17
vector< pii > G[Nmax];
vector< int > c(Kmax), d[Kmax];
int n, k;
int dMin[1 << Kmax][Kmax];
void Bellman_Ford(int, vector< int >&);
void read();
void write(int);
int main()
{
int i, j, l;
read();
for (i = 0; i <= k + 1; ++i)
Bellman_Ford(c[i], d[i]);
for (i = 0; i <= k + 1; ++i)
dMin[0][i] = d[0][c[i]];
for (i = 1; i < (1 << (k + 2)); ++i)
for (j = 0; j <= k + 1; ++j)
{
dMin[i][j] = INF;
for (l = 0; l <= k + 1; ++l)
if ((i & (1 << l)) && dMin[i][j] > dMin[i - (1 << l)][l] + d[l][c[j]])
dMin[i][j] = dMin[i - (1 << l)][l] + d[l][c[j]];
}
write(dMin[(1 << (k + 2)) - 1][k + 1]);
return 0;
}
void Bellman_Ford(int vf, vector< int >& dist)
{
int d;
priority_queue< pii > Q;
dist.assign(n + 1, INF);
dist[vf] = 0;
for (Q.push(priority_queue< pii >::value_type(0, vf)); !Q.empty(); )
{
vf = Q.top().second;
d = Q.top().first;
Q.pop();
if(d == dist[vf])
for(auto it : G[vf])
if (d + it.second < dist[it.first])
{
dist[it.first] = d + it.second;
Q.push(priority_queue< pii >::value_type(dist[it.first], it.first));
}
}
}
void read()
{
int m, a, b, d;
ifstream fin("ubuntzei.in");
fin >> n >> m >> k;
for (int i = 1; i <= k; ++i) fin >> c[i];
c[0] = 1;
c[k + 1] = n;
for (int i = 1; i <= m; ++i)
{
fin >> a >> b >> d;
G[a].push_back(vector< pii >::value_type(b, d));
G[b].push_back(vector< pii >::value_type(a, d));
}
fin.close();
}
void write(int ans)
{
ofstream fout("ubuntzei.out");
fout << ans << '\n';
fout.close();
}