Cod sursa(job #670524)

Utilizator balakraz94abcd efgh balakraz94 Data 29 ianuarie 2012 13:31:54
Problema Ubuntzei Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <cstdio>
#include <vector>
#include<algorithm>
#include <queue>
#define infile "ubuntzei.in"
#define outfile "ubuntzei.out"
#define INF 1<<30
#define k_max 15
#define n_max 10005
#define pii pair<int, int>
#define f first
#define s second
#define mp make_pair
#define pb push_back
#define FOR(g) \
    for(vector<pii> :: iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;


int N, M, K, C[k_max];

int source[n_max], path[k_max][n_max];

vector < pii > G[n_max];

int pd[1<<k_max][k_max];

int Best;


void citeste()
{
	freopen(infile, "r", stdin);
	
	int x, y, z;
	
	scanf("%d %d %d", &N, &M, &K);
	
	for (int i = 0; i < K; ++i)
		scanf("%d", &C[i]);

	while(M--)
	{
		scanf("%d %d %d", &x, &y, &z);
		
		G[x].pb(mp(y,z));
		G[y].pb(mp(x,z));
	}
	fclose(stdin);
}



void dijkstra(int sursa, int *dist)
{
	priority_queue < pii > H;
	
	for (int i = 1; i <= N; ++i)
		dist[i] = INF;
	
	dist[sursa] = 0;
	
	for (int i = 1; i <= N; ++i)
		H.push(mp(-dist[i],i));
	
	for (int i = 1; i < N; ++i)
	{
		int nod = H.top().s;
		H.pop();
		
		FOR(G[nod])
			if (dist[(*it).f] > dist[nod] + (*it).s)
			{
				dist[(*it).f] = dist[nod] + (*it).s;
				H.push(mp(-dist[(*it).f], (*it).f));
			}
	}
}


void rezolva()
{
	int i, j, k, newCost;
	
	dijkstra(1, source);
	
	if (!K)
	{
		Best = source[N];
		return;
	}

	for (i = 0; i < K; ++i)
		dijkstra(C[i], path[i]);

	for (i = 1; i < (1<<K); ++i)
	{
		for (j = 0; j < K; ++j)
			if (i == (1<<j))
				break;
			
		if (j < K && i == (1<<j))
		{
			pd[i][j] = source[C[j]];
			continue;
		}

		for (j = 0; j < K; ++j)
		{
			pd[i][j] = INF;
			
			if (i&(1<<j))
				for (k = 0; k < K; ++k)
					if (k != j && (i&(1<<k)))
					{
						newCost = pd[i-(1<<j)][k] + path[k][C[j]];
						pd[i][j] = min(pd[i][j], newCost);
					}
		}
	}

    Best = INF;
	for (i = 0; i < K; ++i)
		Best = min(Best, pd[(1<<K)-1][i] + path[i][N]);
}


void afiseaza()
{
	freopen(outfile, "w", stdout);
	
	printf("%d\n", Best);
	
	fclose(stdout);
}



int main()
{
	citeste();
	rezolva();
	afiseaza();	

	return 0;
}