Cod sursa(job #1642303)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 9 martie 2016 13:30:01
Problema Ubuntzei Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 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)
{
	queue< int > Q;
	vector< bool > inQ(n + 1, false);
	dist.assign(n + 1, INF);

	dist[vf] = 0;
	inQ[vf] = true;
	for (Q.push(vf); !Q.empty(); Q.pop())
	{
		vf = Q.front();
		inQ[vf] = false;
		
		for(auto it : G[vf])
			if (dist[vf] + it.second < dist[it.first])
			{
				dist[it.first] = dist[vf] + it.second;

				if (!inQ[it.first])
				{
					Q.push(it.first);
					inQ[it.first] = true;
				}
			}
	}
}
/*
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();
}