Cod sursa(job #1640807)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 8 martie 2016 19:27:28
Problema Ubuntzei Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
using namespace std;
#include <fstream>
#include <vector>
#include <queue>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define Nmax 2001
#define Kmax 17

vector< pii > G[Nmax];
vector< int > c(Kmax), d[Kmax];

int n, k;
int dMin[1 << Kmax][Kmax];

void Bellman_Ford(int, vector< int >&);
void read();
void write(int);

int main()
{
	int i, j, l;

	read();

	for (i = 0; i <= k + 1; ++i)
		Bellman_Ford(c[i], d[i]);

	for (i = 0; i <= k + 1; ++i)
		dMin[0][i] = d[0][c[i]];

	for (i = 1; i < (1 << (k + 2)); ++i)
		for (j = 0; j <= k + 1; ++j)
		{
			dMin[i][j] = INF;

			for (l = 0; l <= k + 1; ++l)
				if ((i & (1 << l)) && dMin[i][j] > dMin[i - (1 << l)][l] + d[l][c[j]])
					dMin[i][j] = dMin[i - (1 << l)][l] + d[l][c[j]];
		}

	write(dMin[(1 << (k + 2)) - 1][k + 1]);

    return 0;
}

void Bellman_Ford(int vf, vector< int >& dist)
{
	int d;
	priority_queue< pii > Q;
	dist.assign(n + 1, INF);

	dist[vf] = 0;
	for (Q.push(priority_queue< pii >::value_type(0, vf)); !Q.empty(); )
	{
		vf = Q.top().second;
		d = Q.top().first;
		Q.pop();

		if(d == dist[vf])
			for(auto it : G[vf])
				if (d + it.second < dist[it.first])
				{
					dist[it.first] = d + it.second;
					Q.push(priority_queue< pii >::value_type(dist[it.first], it.first));
				}
	}
}

void read()
{
	int m, a, b, d;
	ifstream fin("ubuntzei.in");

	fin >> n >> m >> k;

	for (int i = 1; i <= k; ++i) fin >> c[i];

	c[0] = 1;
	c[k + 1] = n;

	for (int i = 1; i <= m; ++i)
	{
		fin >> a >> b >> d;
		G[a].push_back(vector< pii >::value_type(b, d));
		G[b].push_back(vector< pii >::value_type(a, d));
	}

	fin.close();
}

void write(int ans)
{
	ofstream fout("ubuntzei.out");

	fout << ans << '\n';

	fout.close();
}