Cod sursa(job #832636)

Utilizator deneoAdrian Craciun deneo Data 11 decembrie 2012 00:15:19
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <set>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

#define MAXN 2100
#define MAXK 16
#define mp make_pair
#define inf 0x3f3f3f3f

int N, K, M, dist[MAXN][MAXN], pd[1 << MAXK][MAXK];
vector<int> nodes;
vector<pair<int, int> > g[MAXN];

void dijkstra(int nod, vector<int> &di) {
	set<pair<int, int> > s;
	s.insert(mp(nod, 0));
	di.resize(N, inf);
	di[nod] = 0;
	
	while (!s.empty()) {
		int nodulet = (*s.begin()).first;
		s.erase(s.begin());
		for (int i = 0; i < g[nodulet].size(); ++i) {
			if (di[g[nodulet][i].first] > di[nodulet] + g[nodulet][i].second) {
				s.erase(mp(g[nodulet][i].first, di[g[nodulet][i].first]));
				di[g[nodulet][i].first] = di[nodulet] + g[nodulet][i].second;
				s.insert(mp(g[nodulet][i].first, di[g[nodulet][i].first]));
			}
		}
	}
}

int main() {
	fin >> N >> M >> K;
	
	for (int i = 1; i <= K; ++i) {
		int x;
		fin >> x; --x;
		nodes.push_back(x);
	}
	
	nodes.push_back(0);
	nodes.push_back(N - 1);
	K += 2;
	
	for (int i = 1; i <= M; ++i) {
		int x, y, z;
		fin >> x >> y >> z; --x; --y;
		g[x].push_back(mp(y, z));
		g[y].push_back(mp(x, z));
	}
	
	for (int i = 0; i < K; ++i) {
		vector<int> di;
		dijkstra(nodes[i], di);
		for (int j = 0; j < K; ++j) 
			dist[i][j] = di[nodes[j]];
	}
	
	memset(pd, inf, sizeof(pd));
	
	for (int i = 0; i < K - 1; ++i) 
		pd[1 << i][i] = dist[K - 2][i];
	
	for (int i = 0; i < (1 << K) - 1; ++i) 
		for (int j = 0; j < K; ++j)
			if (pd[i][j] != inf)
				for (int t = 0; t < K; ++t) 
					if ((1 << t) & (-i))
						pd[i | (1 << t)][t] = min(pd[i | (1 << t)][t], pd[i][j] + dist[j][t]);
		
	fout << pd[(1 << K) - 1][K - 1];
	return 0;
	
}