Pagini recente » Cod sursa (job #807324) | Cod sursa (job #401860) | Cod sursa (job #600252) | Cod sursa (job #1150573) | Cod sursa (job #2767711)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m;
int k, orase[2002];
int permutari[2002];
int fv[2002];
struct elem
{
int nod, cost;
bool operator < (const elem &other) const
{
return cost > other.cost;
}
};
vector<elem> v[2002];
priority_queue<elem> coada;
int ans[2002][2002];
int sol;
void Dijkstra(int sursa)
{
for(int i = 1; i <= n; i ++)
ans[sursa][i] = 1e9;
ans[sursa][sursa] = 0;
coada.push({sursa, 0});
while(!coada.empty())
{
int nod = coada.top().nod;
int cost = coada.top().cost;
coada.pop();
if(ans[sursa][nod] != cost)
{
continue;
}
for(auto it : v[nod])
{
if(cost + it.cost < ans[sursa][it.nod])
{
ans[sursa][it.nod] = cost + it.cost;
coada.push({it.nod, cost + it.cost});
}
}
}
}
void validare()
{
int sum = ans[permutari[1]][1];
for(int i = 2; i <= k; i ++)
{
sum = sum + ans[permutari[i]][permutari[i-1]];
}
sum = sum + ans[permutari[k]][n];
sol = min(sol, sum);
}
void bk(int val)
{
if(val == k + 1)
validare();
for(int i = 1; i <= k; i ++)
{
if(!fv[orase[i]])
{
permutari[val] = orase[i];
fv[orase[i]] = 1;
bk(val + 1);
fv[orase[i]] = 0;
}
}
}
int main()
{
fin >> n >> m;
fin >> k;
for(int i = 1; i <= k; i ++)
{
fin >> orase[i];
}
while(m--)
{
int a, b, c;
fin >> a >> b >> c;
v[a].push_back({b, c});
v[b].push_back({a, c});
}
Dijkstra(1);
for(int i = 1; i <= k; i ++)
{
Dijkstra(orase[i]);
}
sol = INT_MAX;
bk(1);
if(k == 0)
sol = ans[1][n];
fout << sol << '\n';
return 0;
}