Cod sursa(job #295626)

Utilizator CezarMocanCezar Mocan CezarMocan Data 3 aprilie 2009 15:14:09
Problema Team Scor 0
Compilator cpp Status done
Runda Simulare Marime 2.37 kb
#include <cstdio>
#include <cstring>
#include <vector>
#define maxn 510
#define maxp 55
#define inf 1000000000

using namespace std;

int n, m, p, i, j, k, a, b, c;
vector <int> v[maxn], cs[maxn];
int d[maxn][maxp][maxp];
bool viz[maxn][maxp][maxp];
int dmin[maxn][maxn], t[maxp], muc[maxn][maxn];

int baga(int nod, int left, int right) {
	int i, j, ok = 0, fiu, cost, i1, i2, fin = inf;
	if (viz[nod][left][right]) 
		return d[nod][left][right];
	
	viz[nod][left][right] = 1;

	if (left == right) {
		d[nod][left][right] = dmin[nod][t[left]];
		printf("%d %d %d  %d\n", nod, left, right, d[nod][left][right]);
		return d[nod][left][right];
	}


	if (ok) {
		d[nod][left][right] = 0;
		return 0;
	}

//	printf("%d %d %d\n", nod, left, right);

	for (i = 0; i < v[nod].size(); i++) {
		fiu = v[nod][i];
		cost = cs[nod][i];

		i1 = left; i2 = left;
		for (j = left; j <= right; j++) {
//			printf("%d %d\n", j, t[j]);
		
			if (t[j - 1] == fiu)
				i1 = j;
			if (t[j] == fiu) {
				i2 = j - 1;
				if (i2 >= i1) {
//					printf("%d %d %d\n", fiu, i1, i2);
				
					cost += baga(fiu, i1, i2);
				}
			}
		}
		if (t[right] != fiu) {
//			printf("%d %d %d\n", fiu, i1, right);
		
			cost += baga(fiu, i1, right);
		}
		if (cost < fin)
			fin = cost;
		//tre sa merg sa vad cum sparg intervalu curent
	}

	printf("%d %d %d  %d\n", nod, left, right, fin);

	d[nod][left][right] = fin;
	return fin;

}

int main() {
	freopen("team.in", "r", stdin);
	freopen("team.out", "w", stdout);

	scanf("%d%d%d", &p, &n, &m);
	for (i = 1; i <= m; i++) {
		scanf("%d%d%d", &a, &b, &c);
		muc[a][b] = muc[b][a] = 1;
		v[a].push_back(b);
		cs[a].push_back(c);

		v[b].push_back(a);
		cs[b].push_back(c);
	}

	for (i = 1; i <= p; i++)
		scanf("%d", &t[i]);

	for (i = 0; i < maxn; i++)
		for (j = 0; j < maxp; j++)
			for (k = 0; k < maxp; k++)
				d[i][j][k] = inf;

	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++)
			dmin[i][j] = inf;

	for (i = 1; i <= n; i++)
		for (j = 0; j < v[i].size(); j++) {
			dmin[i][v[i][j]] = cs[i][j];
			dmin[v[i][j]][i] = cs[i][j];
		}


	for (i = 1; i <= n; i++)
		dmin[i][i] = 0;

	for (k = 1; k <= n; k++)
		for (i = 1; i <= n; i++)
			if (muc[i][k])
				for (j = 1; j <= n; j++)
					if (dmin[i][k] + dmin[k][j] < dmin[i][j])
						dmin[i][j] = dmin[i][k] + dmin[k][j];

	printf("%d\n", baga(1, 1, p));

	//sparg intervalu pe bucati la inceputu functiei si iau minimu pentru fiecare bucata

	return 0;
}