Pagini recente » Cod sursa (job #3242826) | Cod sursa (job #2861163) | Cod sursa (job #2836684) | Cod sursa (job #18074) | Cod sursa (job #295783)
Cod sursa(job #295783)
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
#define MAX_S 262144
#define MAX_P 64
#define MAX_N 512
#define INF 1000000000
int p, n, m, i, j, d, k, rez, ok;
struct drum {
int x;
int y;
int c;
} v[MAX_S];
int c[MAX_P][MAX_P][MAX_N];
int stop[MAX_P], trec[MAX_P];
vector <int> A[MAX_N];
vector <int> C[MAX_N];
void cit() {
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d", &p);
scanf("%d", &n);
scanf("%d", &m);
for (i = 1; i <= m; i++) {
scanf("%d %d %d", &v[i].x, &v[i].y, &v[i].c);
A[v[i].x].push_back(v[i].y);
A[v[i].y].push_back(v[i].x);
C[v[i].x].push_back(v[i].c);
C[v[i].y].push_back(v[i].c);
}
for (i = 1; i <= p; i++)
scanf("%d", &stop[i]);
}
void solve() {
for (i = 0; i <= p; i++)
for (j = 0; j <= p; j++)
for (k = 1; k <= n; k++)
c[i][j][k] = INF;
for (i = 0; i <= p; i++)
c[i][0][stop[i]] = 0;
for (d = 0; d <= p; d++)
for (i = 1; i + d <= p; i++) {
memset(trec, 0, sizeof(trec));
for (k = 1; k <= n; k++) {
//am sa rezolv grupul i..d + i care sunt in statia k
//primul caz e cand coboara un membru al gastii, si se sparge intervalul
rez = INF;
for (j = i; j <= i + d; j++)
if (stop[j] == k)
if (j - i >= 0 && i + d - 1 - j >= 0)
rez = min(rez, c[i][j - i][k] + c[j + 1][i + d - 1 - j][k]);
c[i][d][k] = min(c[i][d][k], rez);
}
//rezolv cazul in care membrii gastii isi pastreaza intervalul si se duc in alt nod
ok = 1;
while (ok) {
ok = 0;
for (k = 1; k <= n; k++) {
int len = A[k].size();
for (j = 0; j < len; j++) {
int next = A[k][j];
if (c[i][d][next] + C[k][j] < c[i][d][k]) {
ok = 1;
c[i][d][k] = c[i][d][next] + C[k][j];
}
}
}
}
}
}
int main() {
cit();
solve();
printf("%d\n", c[1][p - 1][1]);
return 0;
}