Pagini recente » Cod sursa (job #272656) | Cod sursa (job #2451546) | Cod sursa (job #771938) | Cod sursa (job #1713038) | Cod sursa (job #2856397)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int dp[33005][2005], n, m, k, loc[20], d[2005], c[2005][2005];
vector< pair<int, int> >L[2005];
void Dijkstra(int x)
{
for(int i = 1; i <= n; i++)
d[i] = 2e9;
priority_queue<pair<int, int>>q;
q.push({0, x});
d[x] = 0;
while(!q.empty())
{
int nod = q.top().second;
q.pop();
for(auto i : L[nod])
if(d[i.second] > d[nod] + i.first)
{
d[i.second] = d[nod] + i.first;
q.push({-d[i.second], i.second});
}
}
}
void CalcMatrCosturi()
{
loc[0] = 1;
loc[++k] = n;
for(int i = 0; i < k; i++)
{
Dijkstra(loc[i]);
c[loc[i]][loc[i + 1]] = c[loc[i + 1]][loc[i]]= d[loc[i + 1]];
for(int j = 1; j <= n; j++)
if(d[j] != 2e9)
c[loc[i]][j] = c[j][loc[i]] = d[j];
}
// for(int i = 0; i <= k; i++, cout << "\n")
// for(int j = 0; j <= k; j++)
// cout << c[loc[i]][loc[j]] << " ";
}
void DP()
{
int P = (1 << (k + 1));
for(int masca = 1; masca < P; masca++)
for(int j = 0; j <= k; j++)
dp[masca][j] = 2e9;
for(int i = 0; i <= k; i++)
dp[1 << i][i] = c[1][loc[i]];
for(int masca = 1; masca < P; masca++)
for(int i = 0; i <= k; i++)
if((masca & (1 << i)))
for(int j = 0; j <= k; j++)
if(i != j && (masca & (1 << j)) == 0)
dp[masca | (1 << j)][j] = min(dp[masca | (1 << j)][j], dp[masca][i] + c[loc[i]][loc[j]]);
fout << dp[P - 1][k] << "\n";
fout.close();
}
int main()
{
fin >> n >> m;
fin >> k;
for(int i = 1; i <= k; i++)
fin >> loc[i];
int x, y, c;
for(int i = 1; i <= m; i++)
{
fin >> x >> y >> c;
L[x].push_back({c, y});
L[y].push_back({c, x});
}
CalcMatrCosturi();
DP();
return 0;
}