Cod sursa(job #295783)

Utilizator savimSerban Andrei Stan savim Data 3 aprilie 2009 17:54:21
Problema Team Scor 5
Compilator cpp Status done
Runda Simulare Marime 1.88 kb
#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;
}