Cod sursa(job #840135)

Utilizator ELHoriaHoria Cretescu ELHoria Data 22 decembrie 2012 13:37:22
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
#include <queue>
#include <vector>

#define pii pair<int,int>
#define x first
#define y second
#define mp make_pair
using namespace std;

ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");

const int nmax = 2002, inf = int(2e9);
vector< pii > G[nmax];
int N, M, K, C[16];
priority_queue< pii ,vector< pii > > h;
vector<int> D[16];
int bst[1<<15][16];

void readData() {
	cin>>N>>M>>K;
	for(int i = 0;i < K;++i) {
		cin>>C[i];
		C[i]--;
	}
	int a, b, c;
	for(int i = 1;i <= M;++i) {
		cin>>a>>b>>c;
		a--;b--;
		G[a].push_back(mp(b,c));
		G[b].push_back(mp(a,c));
	}
}

void djikstra(int src,vector<int> &dist) {
	dist.resize(N,inf);
	dist[src] = 0;
	h.push(mp(0,src));
	int v;
	while(!h.empty()) {
		v = h.top().y;
		h.pop();
		for(vector< pii >::const_iterator w = G[v].begin();w != G[v].end();++w) {
				if(dist[(*w).x] > dist[v] + (*w).y) {
					dist[(*w).x] = dist[v] + (*w).y;
					h.push(mp(-dist[(*w).x],(*w).x));
			}
		}
	}
}

int solve() {
	int ret = inf;
	if(!K) {
		djikstra(0,D[0]);
		return D[0][N - 1];
	}

	queue< pii > q;
	for(int i = 0;i < (1<<K);++i) {
		for(int j = 0;j < K;++j) {
			bst[i][j] = inf;
		}
	}

	for(int i = 0;i < K;++i) {
		djikstra(C[i],D[i]);
		q.push(mp(1<<i,i));
		bst[1<<i][i] = D[i][0];
	}
	pii state;
	while(!q.empty()) {
		state = q.front();
		q.pop();
		for(int j = 0;j < K;++j) {
			if((state.x >>j) & 1) continue;
			if(bst[state.x | (1<<j)][j] > bst[state.x][state.y] + D[state.y][C[j]]) {
				bst[state.x | (1<<j)][j] = bst[state.x][state.y] + D[state.y][C[j]];
				q.push(mp(state.x | (1<<j),j));
			}
		}
	}

	for(int j = 0;j < K;++j) {
		ret = min(ret,bst[(1<<K) - 1][j] + D[j][N - 1]);
	}
	
	return ret;
}

int main()
{
	readData();
	cout<<solve();
	return 0;
}