Pagini recente » Cod sursa (job #2674411) | Cod sursa (job #1973531) | Cod sursa (job #1596863) | Cod sursa (job #1399197) | Cod sursa (job #3357417)
#include <bits/stdc++.h>
using namespace std;
const long long INF = 4e18;
long long distanta[505][505];
long long dp[55][55][505];
int destinatie[55];
int main()
{
ifstream in("team.in");
ofstream out("team.out");
int p, n, m;
in >> p;
in >> n;
in >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i == j)
distanta[i][j] = 0;
else
distanta[i][j] = INF;
for(int i = 1; i <= m; i++)
{
int x, y, c;
in >> x >> y >> c;
distanta[x][y] = min(distanta[x][y], (long long)c);
distanta[y][x] = min(distanta[y][x], (long long)c);
}
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(distanta[i][k] + distanta[k][j] <
distanta[i][j])
distanta[i][j] =
distanta[i][k] + distanta[k][j];
for(int i = 1; i <= p; i++)
in >> destinatie[i];
for(int i = 1; i <= p; i++)
for(int j = i; j <= p; j++)
for(int v = 1; v <= n; v++)
dp[i][j][v] = INF;
for(int i = 1; i <= p; i++)
dp[i][i][destinatie[i]] = 0;
for(int lung = 1; lung <= p; lung++)
{
bool modificat = true;
while(modificat)
{
modificat = false;
for(int i = 1; i + lung - 1 <= p; i++)
{
int j = i + lung - 1;
for(int k = i; k < j; k++)
{
for(int v = 1; v <= n; v++)
{
long long nou =
dp[i][k][v] +
dp[k + 1][j][v];
if(nou < dp[i][j][v])
{
dp[i][j][v] = nou;
modificat = true;
}
}
}
int persoane = j - i + 1;
for(int mid = 1; mid <= n; mid++)
{
if(dp[i][j][mid] == INF)
continue;
for(int v = 1; v <= n; v++)
{
long long nou =
dp[i][j][mid] +
1LL * persoane *
distanta[mid][v];
if(nou < dp[i][j][v])
{
dp[i][j][v] = nou;
modificat = true;
}
}
}
}
}
}
out << dp[1][p][1] << '\n';
return 0;
}