Pagini recente » Cod sursa (job #3247441) | Cod sursa (job #1322698) | Cod sursa (job #1816344) | Cod sursa (job #1383269) | Cod sursa (job #1642353)
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, ans;
read();
for (i = 0; i <= k; ++i)
Bellman_Ford(c[i], d[i]);
dMin[0][0] = 0;
for (i = 1; i < (1 << k); ++i)
for (j = 1; j <= k; ++j)
{
dMin[i][j] = INF;
for (l = 0; l <= k; ++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]];
}
for (ans = INF, i = 1; i <= k; ++i)
if (ans > dMin[(1 << k) - 1][i] + d[i][n])
ans = dMin[(1 << k) - 1][i] + d[i][n];
write(ans);
return 0;
}
void Bellman_Ford(int vf, vector< int >& dist)
{
queue< int > Q;
vector< bool > inQ(n + 1, false);
dist.assign(n + 1, INF);
dist[vf] = 0;
inQ[vf] = true;
for (Q.push(vf); !Q.empty(); Q.pop())
{
vf = Q.front();
inQ[vf] = false;
for(auto it : G[vf])
if (dist[vf] + it.second < dist[it.first])
{
dist[it.first] = dist[vf] + it.second;
if (!inQ[it.first])
{
Q.push(it.first);
inQ[it.first] = true;
}
}
}
}
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();
}