Pagini recente » Cod sursa (job #506222) | Cod sursa (job #2517321) | Cod sursa (job #1875020) | Cod sursa (job #3303970) | Cod sursa (job #3309421)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
vector<vector<pair<int,int>>> grf;
int dist[2005];
void dijkstra(int nr, int n)
{
priority_queue<pair<int, int>> proq;
proq.push({-dist[nr],nr});
dist[0] = 0;
while (!proq.empty()) {
int node = proq.top().second;
int cost = -proq.top().first;
proq.pop();
if (cost != dist[node])
continue;
for (int i = 0; i < grf[node].size(); i++)
{
int next = grf[node][i].first;
int c = grf[node][i].second;
if (cost + c < dist[next])
{
dist[next] = cost + c;
proq.push({-dist[next], next});
}
}
}
}
int maxi[20][20];
int Hamilton(int n)
{
vector<vector<int>> dp((1 << n),vector<int>(n, (1<<29)));
dp[1][0] = 0;
for (int mask=2;mask<dp.size();mask++)
{
if((mask&1)==0)
continue;
for (int i=0;i<n;i++)
{
if((mask&(1 << i))==0)
continue;
for (int j=0;j<n;j++)
{
if((mask&(1 << j))==0)
continue;
dp[mask][i] = min(dp[mask ^ (1 << i)][j] + maxi[j][i], dp[mask][i]);
}
}
}
return dp[(1<<n)-1][n-1];
}
int v[20];
int main()
{
int n,m,k,a,b,c;
in>>n>>m>>k;
v[0]=1;
v[k+1]=n;
for(int i=1;i<=k;i++)
in>>v[i];
for(int i=1;i<=m;i++)
{
in>>a>>b>>c;
grf[a].push_back({b, c});
grf[b].push_back({a, c});
}
for(int i=0;i<=k+1;i++)
{
for(int j=0;j<=k+1;j++)
maxi[i][j]=1e9;
}
for(int i=0;i<=k+1;i++)
{
dijkstra(v[i],n);
for(int j=0;j<=k+1;j++)
maxi[i][j]=dist[v[j]];
}
out<<Hamilton(k+2);
return 0;
}