Cod sursa(job #1642353)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 9 martie 2016 13:41:54
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 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, ans;

	read();

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

	dMin[0][0] = 0;

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

			for (l = 0; l <= k; ++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]];
		}

	for (ans = INF, i = 1; i <= k; ++i)
		if (ans > dMin[(1 << k) - 1][i] + d[i][n])
			ans = dMin[(1 << k) - 1][i] + d[i][n];

	write(ans);

    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 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();
}