Pagini recente » Cod sursa (job #164720) | Cod sursa (job #18274) | Cod sursa (job #2985071) | Cod sursa (job #2984732) | Cod sursa (job #2102474)
#include <fstream>
#include <vector>
#define INF 2000000000
#define DIMP 52
#define DIM 502
using namespace std;
int DJ[DIMP][DIM];
int D[DIMP][DIMP][DIMP];
int v[DIMP], u[DIM];
vector < pair<int, int> > L[DIM];
int n, m, p, x, y, c, k, poz;
int calcul(int k, int i, int j) {
if (i > j)
return 0;
if (D[k][i][j] != INF)
return D[k][i][j];
for (int t = i; t<=j; t++) {
/// plec din punctul de destinatie al persoanei k si duc la
/// destinatie persoana t apoi pe celelalte
D[k][i][j] = min(D[k][i][j], DJ[k][v[t]] +
calcul( t, i, t-1 )
+ calcul(t, t+1, j));
}
return D[k][i][j];
}
int main () {
ifstream fin ("team.in");
ofstream fout("team.out");
fin>>p>>n>>m;
for (int i=1;i<=m;i++) {
fin>>x>>y>>c;
L[x].push_back(make_pair(y, c));
L[y].push_back(make_pair(x, c));
}
v[1] = 1;
k = 1;
for (int i=1;i<=p;i++) {
fin>>x;
if (x != v[k]) {
v[++k] = x;
}
}
p = k;
for (k=1;k<=p;k++) {
/// distanta minima de la v[i] la toate celelalte noduri
for (int i=1;i<=n;i++) {
DJ[k][i] = INF;
u[i] = 0;
}
DJ[k][ v[k] ] = 0;
for (int i=1;i<=n;i++) {
int minim = INF;
for (int j=1;j<=n;j++)
if (u[j] == 0 && DJ[k][j] < minim) {
minim = DJ[k][j];
poz = j;
}
u[poz] = 1;
if (minim != INF) {
for (int j=0;j<L[poz].size();j++) {
int vecin = L[poz][j].first;
int cost = L[poz][j].second;
if (DJ[k][vecin] > DJ[k][poz] + cost)
DJ[k][vecin] = DJ[k][poz] + cost;
}
}
}
}
///DJ[i][j] = distanta minima de la destinatia persoanei i la nodul j
for (k=1;k<=p;k++)
for (int i=1;i<=p;i++)
for (int j=i;j<=p;j++)
D[k][i][j] = INF;
for (int i=1;i<=p;i++)
D[i][i][i] = 0;
fout<<calcul(1, 1, p)<<"\n";
/*
for (int i=1;i<=p;i++) {
for (int j=1;j<=p;j++) {
for (k=1;k<=p;k++)
fout<<D[i][j][k]<<" ";
fout<<"\n";
}
fout<<"\n";
}
*/
return 0;
}