Cod sursa(job #582833)

Utilizator freak93Adrian Budau freak93 Data 16 aprilie 2011 05:20:28
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <vector>
#include <set>

using namespace std;

const char iname[] = "ubuntzei.in";
const char oname[] = "ubuntzei.out";
const int inf = static_cast<unsigned int>(1 << 31) - 1;

ifstream f(iname);
ofstream g(oname);

void dijkstra(const int &source, const vector< vector< pair<int, int> > > &E, vector<int> &dis) {
	dis.resize(E.size(), inf);
	dis[source] = 0;
	set< pair<int, int> > S;
	S.insert(make_pair(0, source));
	while (!S.empty()) {
		int x = S.begin() -> second;
		S.erase(S.begin());
		for (vector< pair<int, int> >::const_iterator it = E[x].begin(); it != E[x].end(); ++it)
			if (dis[x] + it -> second < dis[it -> first]) {
				S.erase(make_pair(dis[it -> first], it -> first));
				dis[it -> first] = dis[x] + it -> second;
				S.insert(make_pair(dis[it -> first], it -> first));
			}
	}
}

int main() {
	int N, M; f >> N >> M;
	int K; f >> K;
	vector<int> nodes;
	for (int i = 0; i < K; ++i) {
		int x; f >> x; --x;
		nodes.push_back(x);
	}
	nodes.push_back(N - 1);
	nodes.push_back(0);
	K += 2;
	vector< vector< pair<int, int> > >E(N);
	for (int i = 0; i < M; ++i) {
		int x, y, z; f >> x >> y >> z;
		--x; --y;
		E[x].push_back(make_pair(y, z));
		E[y].push_back(make_pair(x, z));
    }

	vector< vector<int> > dist(K, vector<int>(K, 0));
	for (int i = 0; i < K; ++i) {
		vector<int> dis;
		dijkstra(nodes[i], E, dis);             
		for (int j = 0; j < K; ++j)
			dist[i][j] = dis[nodes[j]];
	} 
	vector< vector<int> > dp(1 << (K - 1), vector<int>(K - 1, inf));
	for (int i = 0; i < K - 1; ++i)
		dp[1 << i][i] = dist[K - 1][i];
	
    for (int i = 0; i < (1 << (K - 1)); ++i)
		for (int j = 0; j < K - 1; ++j)
			if (dp[i][j] != inf)
				for (int k = 0; k < (K - 1); ++k)
					if ((1 << k) & (~i))
						dp[i | (1 << k)][k] = min(dp[i | (1 << k)][k], dp[i][j] + dist[j][k]);
	
	g << dp[(1 << (K - 1)) - 1][K - 2] << "\n";
}