Pagini recente » Cod sursa (job #2293639) | Cod sursa (job #2644226)
#include <iostream>
#include <fstream>
#include <vector>
#include <limits.h>
#include <set>
#include <algorithm>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int N = 2005, inf = INT_MAX, MaxPrieteni = 20;
vector<pair<int, int>> g[N];
int OrasDeVizitat[MaxPrieteni];
int n, m, k, CostMin[N][N];
void Init()
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
CostMin[i][j] = inf;
}
}
}
void Dijkstra(int start)
{
set<pair<int, int>> heap; // cost spre nod
heap.insert({ 0, start });
CostMin[start][start] = 0;
while (!heap.empty())
{
int nod = heap.begin()->second;
int cost = heap.begin()->first;
heap.erase(heap.begin());
for (auto neigh : g[nod])
{
int NextNod = neigh.first;
int NextCost = neigh.second;
if (cost + NextCost < CostMin[start][NextNod])
{
if (CostMin[start][NextNod] != inf)
{
heap.erase(heap.find({ CostMin[start][NextNod], NextNod }));
}
CostMin[start][NextNod] = cost + NextCost;
heap.insert({ CostMin[start][NextNod], NextNod });
}
}
}
}
int main()
{
fin >> n >> m >> k;
OrasDeVizitat[0] = 1;
for (int i = 1; i <= k; i++)
{
fin >> OrasDeVizitat[i];
}
for (int i = 0; i < m; i++)
{
int x, y, cost;
fin >> x >> y >> cost;
g[x].push_back({ y, cost });
g[y].push_back({ x, cost });
}
Init();
for (int i = 0; i <= k; i++)
{
Dijkstra(OrasDeVizitat[i]);
}
int lim = 1 << (k + 1);
vector<vector<int>> dp(lim, vector<int>(k + 1, inf));
dp[1][0] = 0;
for (int mask = 3; mask < lim; mask += 2)
{
for (int i = 1; i <= k; i++)
{
if (mask & (1 << i))
{
for (int j = 0; j <= k; j++)
{
if (i != j && (mask & (1 << j)))
{
if (dp[mask - (1 << i)][j] != inf)
{
dp[mask][i] = min(dp[mask][i], dp[mask - (1 << i)][j] + CostMin[OrasDeVizitat[j]][OrasDeVizitat[i]]);
}
}
}
}
}
}
int ans = inf;
for (int i = 0; i <= k; i++)
{
if (dp[lim - 1][i] != inf)
{
ans = min(ans, dp[lim - 1][i] + CostMin[OrasDeVizitat[i]][n]);
}
}
fout << ans;
}