Pagini recente » Cod sursa (job #2439417) | Cod sursa (job #3289913) | Cod sursa (job #1432072) | Cod sursa (job #2962864) | Cod sursa (job #2726277)
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
int n, m, k, rez;
const int inf = 1e9;
int d[2005], v[2005];
bool used[2005], inq[2005];
int dp[2005][2005], sol[2005];
queue < int > q;
vector < pair < int, int > > graf[2005];
void BellmanFord (int start)
{
for (int i=1; i<=n; i++)
d[i] = inf;
d[start] = 0; inq[start] = 1;
q.push(start);
while (!q.empty())
{
int nod = q.front();
q.pop(); inq[nod] = 0;
for (int i=0; i<graf[nod].size(); i++)
{
int vecin = graf[nod][i].first;
int cost = graf[nod][i].second;
if (d[nod] + cost < d[vecin])
{
d[vecin] = d[nod] + cost;
if (!inq[vecin])
{
q.push(vecin);
inq[vecin] = 1;
}
}
}
}
}
void Eval ()
{
int sum = 0;
for (int i=1; i<k; i++)
{
int nod = v[sol[i]];
int vecin = v[sol[i+1]];
sum += dp[nod][vecin];
}
sum += dp[1][v[sol[1]]];
sum += dp[v[sol[k]]][n];
rez = min(rez, sum);
}
void Bkt (int niv)
{
for (int i=1; i<=k; i++)
{
if (!used[i])
{
sol[niv] = i;
used[i] = 1;
if (niv == k) Eval();
else Bkt(niv + 1);
used[i] = 0;
}
}
}
int main()
{
f >> n >> m >> k;
for (int i=1; i<=k; i++)
f >> v[i];
for (int i=1; i<=m; i++)
{
int x, y, c;
f >> x >> y >> c;
graf[x].push_back(make_pair(y, c));
graf[y].push_back(make_pair(x, c));
dp[x][y] = dp[y][x] = c;
}
if (k == 0)
{
BellmanFord(1);
g << d[n];
}
else
{
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
if (i != j && !dp[i][j])
dp[i][j] = inf;
}
}
for (int t=1; t<=n; t++)
{
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
if (i != j && dp[i][t] && dp[t][j])
dp[i][j] = min(dp[i][j], dp[i][t] + dp[t][j]);
}
}
}
sort(v+1, v+k+1);
rez = inf; Bkt(1);
g << rez;
}
return 0;
}