Pagini recente » Cod sursa (job #1919045) | Cod sursa (job #692542) | Cod sursa (job #2712699) | Cod sursa (job #3271471) | Cod sursa (job #3224575)
#include <fstream>
#include <vector>
#include <set>
using namespace std;
#define int long long
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n, m, cnt;
int w[20];
vector<pair<int, int>> v[2005];
int dist[20][10005];
int dp[32780];
int INF = (1 << 30);
void dijkstra(int start)
{
for(int i = 1; i<=n; i++)
{
dist[start][i] = INF;
}
multiset<pair<int, int>> s;
s.insert({w[start], 0});
dist[start][w[start]] = 0;
int nod, d;
while(!s.empty())
{
nod = (*s.begin()).first;
d = (*s.begin()).second;
s.erase(s.begin());
for(auto it: v[nod])
{
if(dist[start][it.first] > d + it.second)
{
dist[start][it.first] = d + it.second;
s.insert({it.first, dist[start][it.first]});
}
}
}
}
signed main()
{
in>>n>>m;
in>>cnt;
for(int i = 0; i<cnt; i++)
{
in>>w[i];
}
int x, y, c;
for(int i = 1; i<=m; i++)
{
in>>x>>y>>c;
v[x].push_back({y, c});
v[y].push_back({x, c});
}
int stmax = (1 << cnt);
for(int i = 0; i<stmax; i++)
{
dp[i] = INF;
}
for(int i = 0; i<cnt; i++)
{
dijkstra(i);
/*for(int j = 1; j<=n; j++)
{
out<<dist[i][j]<<" ";
}*/
dp[1 << i] = dist[i][1];
}
for(int mask = 0; mask < stmax; mask++)
{
for(int i = 0; i<cnt; i++)
{
if(mask & (1 << i))
{
for(int j = 0; j<cnt; j++)
{
if(i != j && (mask & (1 << j)) == 0)
{
dp[mask + (1 << j)] = min(dp[mask + (1 << j)], dp[mask] + dist[i][w[j]]);
}
}
}
}
}
int ans = INF;
for(int i = 0; i<cnt; i++)
{
ans = min(ans, dp[stmax - 1] + dist[i][n]);
//out<<i<<" -> "<<dp[stmax - 1] + dist[i][n]<<'\n';
}
out<<ans;
return 0;
}