Pagini recente » Cod sursa (job #3234412) | Cod sursa (job #1988366) | Cod sursa (job #2654623) | Cod sursa (job #2571002) | Cod sursa (job #2854478)
#include <bits/stdc++.h>
using namespace std;
const int oo = 1e9;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, k;
int dp[20][(1<<15)];
int dist[2005];
int d[1005][1005];
int viz[2005];
int C[2000];
vector< pair<int, int> >V[2005];
void Dijkstra(int x)
{
int i, j;
for(i = 1;i <= n;i++)
dist[i] = oo;
dist[x] = 0;
priority_queue<pair<int, int>>pq;
pq.push({0, x});
while(!pq.empty())
{
int nod = pq.top().second;
pq.pop();
for(auto it : V[nod])
if(dist[it.first] > dist[nod] + it.second)
{
dist[it.first] = dist[nod] + it.second;
pq.push({-dist[it.first], it.first});
}
}
for(i = 0;i <= k + 1;i++)
d[x][C[i]] = dist[C[i]];
}
void Citire()
{
int i, x, y, cost;
fin >> n >> m >> k;
for(i = 1;i <= k;i++)
fin >> C[i];
C[0] = 1;
C[k + 1] = n;
for(i = 1;i <= m;i++)
{
fin >> x >> y >> cost;
V[x].push_back({y, cost});
V[y].push_back({x, cost});
}
}
void Solve()
{
int i, stare, j, masca;
for(i = 0;i <= k + 1;i++)
Dijkstra(C[i]);
int K = (1 << k) - 1;
for(stare = 0;stare <= K;stare++)
for(i = 0;i <= k + 1;i++)
dp[i][stare] = oo;
for(i = 0;i <= k + 1;i++)
{
dp[i][(1 << (i - 1))] = d[1][C[i]];
}
for(stare = 0;stare <= K;stare++)
for(i = 1;i <= k;i++)
if((stare & (1 << (i - 1))))
for(j = 1;j <= k;j++)
if((stare & (1 << (j - 1))) == 0)
{
masca = (stare | (1 << (j - 1)));
dp[j][masca] = min(dp[j][masca], dp[i][stare] + d[C[j]][C[i]]);
cout << dp[j][masca] << " ";
}
int sol = oo;
for(i = 0;i <= k + 1;i++)
sol = min(sol, dp[i][K] + d[C[i]][n]);
fout << sol << "\n";
}
int main()
{
Citire();
Solve();
return 0;
}