Pagini recente » Cod sursa (job #3123950) | Cod sursa (job #2114169) | Cod sursa (job #1061772) | Cod sursa (job #2392187) | Cod sursa (job #2230821)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define lim 2000
#define oo 0x3f3f3f3f
#define mp make_pair
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n, m, k, go[lim+1], dp[1<<15][16], Dist[16][lim+1], answer;
vector<pair<int,int> > G[lim+1];
queue<int> Q;
void Read()
{
f >> n >> m;
f >> k;
go[0] = 1;
for(int i = 1; i <= k; ++i)
{
int t;
f >> t;
go[i] = t;
}
for(int i = 0; i <= k; ++i)
for(int j = 1; j <= n; ++j)
Dist[i][j] = oo;
for(int i = 1; i <= m; ++i)
{
int x, y, c;
f >> x >> y >> c;
G[x].push_back(mp(y, c));
G[y].push_back(mp(x, c));
}
}
void BelFord(int src)
{
Dist[src][go[src]] = 0;
Q.push(go[src]);
while(!Q.empty())
{
int v = Q.front();
Q.pop();
for(vector<pair<int,int> > :: iterator it = G[v].begin(); it != G[v].end(); ++it)
{
int v2 = it->first, d = it->second;
if(Dist[src][v2] > Dist[src][v] + d)
{
Dist[src][v2] = Dist[src][v] + d;
Q.push(v2);
}
}
}
}
void Dp()
{
for(int i = 1; i <= k; ++i)
dp[1<<(i-1)][i] = Dist[0][go[i]];
for(int s = 1; s < 1<<k; ++s)
for(int i = 1; i <= k; ++i)
if(s != 1<<(i-1) && s & 1<<(i-1))
{
dp[s][i] = oo;
for(int j = 1; j <= k; ++j)
if(i != j && s & 1<<(j-1))
dp[s][i] = min(dp[s][i], dp[s-(1<<(i-1))][j] + Dist[j][go[i]]);
}
}
int main()
{
Read();
for(int i = 0; i <= k; ++i)
BelFord(i);
if(k == 0)
{
g << Dist[0][n];
return 0;
}
Dp();
answer = oo;
int s = (1<<k)-1;
for(int i = 1; i <= k; ++i)
answer = min(answer, dp[s][i] + Dist[i][n]);
g << answer;
}