Cod sursa(job #1605939)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 19 februarie 2016 17:06:42
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <bitset>
#include <stack>
#include <iomanip>
#define MOD 1000000007
#define NMAX 2005
#define INF 0x3f3f3f3f

using namespace std;

FILE *fin = freopen("ubuntzei.in", "r", stdin);
FILE *fout = freopen("ubuntzei.out", "w", stdout);

typedef pair<int, int> pii;

vector<int> prieteni;
int d[NMAX][NMAX];

int main() {
	int n, m, i, j, k, p, x, y, c, res, sum;

	cin >> n >> m >> p;

	prieteni.resize(p + 1);
	for (i = 1; i <= p; ++i)
		cin >> prieteni[i];

	for (i = 0; i <= n; ++i)
		for (j = 0; j <= n; ++j)
			d[i][j] = INF;
	for (i = 0; i < n; ++i)
		d[i][i] = 0;

	for (i = 0; i < m; ++i) {
		cin >> x >> y >> c;
		d[x][y] = d[y][x] = c;
	}

	for (k = 1; k <= n; ++k)
		for (i = 1; i <= n; ++i)
			for (j = 1; j <= n; ++j)
				if (i != k && i != j && j != k)
					d[i][j] = min(d[i][j], d[i][k] + d[k][j]);

	if (p > 0) {
		sort(prieteni.begin(), prieteni.end());

		res = INF;
		do {
			sum = d[1][prieteni[1]] + d[prieteni[p]][n];

			for (i = 1; i < p; ++i)
				sum += d[prieteni[i]][prieteni[i + 1]];

			res = min(res, sum);
		} while (next_permutation(prieteni.begin(), prieteni.end()));

		cout << res;
	}
	else
		cout << d[0][n - 1];

	return 0;
}