Cod sursa(job #2347895)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 19 februarie 2019 10:57:36
Problema Ubuntzei Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");

const int DIM = 2007;
const int INF = 1e9;

vector <pair <int, int> > v[DIM];

int n;

bitset <DIM> vis;

int d[DIM][DIM];
int best[20][20];

void dijkstra(int start, int d[DIM])
{
	for(int i = 1; i <= n; i++)
		d[i] = INF;
		
	priority_queue <pair <int, int> > q;
	
	d[start] = 0;
	q.push({0, start});
	vis[start] = 1;
	
	while(!q.empty())
	{
		int nod = q.top().second;
		q.pop();
		
		vis[nod] = 0;
		
		for(auto i : v[nod])
		{
			int cost = i.second;
			int next = i.first;
			
			if(d[next] > d[nod] + cost)
			{
				d[next] = d[nod] + cost;
				
				if(vis[next] == 0)
				{
					vis[next] = 1;
					
					q.push({-d[next], next});
				}
			}
		}
	}
}

int oras[20];

int main()
{
	int m, k;
	in >> n >> m >> k;
	
	for(int i = 1; i <= k; i++)
		in >> oras[i];
	
	while(m--)
	{
		int x, y, c;
		in >> x >> y >> c;
		
		v[x].push_back({y, c});
		v[y].push_back({x, c});
	}
	
	dijkstra(1, d[1]);
	
	for(int i = 1; i <= k; i++)
		dijkstra(oras[i], d[oras[i]]);
	
	if(k == 0)
	{
		out << d[1][n];
		return 0;
	}
	
	for(int i = 1; i < (1 << k); i++)
		for(int j = 1; j <= n; j++)
			best[i][j] = INF;
	
	for(int i = 1; i <= k; i++)
		best[(1 << (i - 1))][i] = d[1][oras[i]];
	
	for(int i = 1; i < (1 << k); i++)
		for(int j = 1; j <= k; j++)
			if(i & (1 << (j - 1)))
				for(int t = 1; t <= k; t++)
					if(t != j && (i & (1 << (t - 1))))
						best[i][j] = min(best[i][j], best[i ^ (1 << (j - 1))][t] + d[oras[t]][oras[j]]);
	
	int mi = INF;
	
	for(int i = 1; i <= k; i++)
		mi = min(mi, best[(1 << k) - 1][i] + d[oras[i]][n]);
	
	out << mi;
}