Cod sursa(job #2841092)

Utilizator sireanu_vladSireanu Vlad sireanu_vlad Data 29 ianuarie 2022 11:55:54
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

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

const int oo = 2e9;
int n, m, k, c[18], d[2001], f[2001], dist[18][18];
long long dp[1<<17][17];
struct elem {int id, cost;};
vector<elem> g[2001];
vector<int> g2[2001];

struct comp {bool operator()(int i, int j) {return d[i] > d[j];}};
priority_queue<int, vector<int>, comp> q;

void read()
{
	in >> n >> m >> k;
	c[1] = 1, k++;
	for(int i = 2; i <= k; ++i)
		in >> c[i];
	c[++k] = n;
	int x, y, cc;
	while(m--)
	{
		in >> x >> y >> cc;
		g[x].push_back({y, cc});
		g[y].push_back({x, cc});
	}
}

void dijkstra(int s)
{
	for(int i = 1; i <= n; ++i)
		d[i] = oo, f[i] = 0;
 
	q.push(s);
	f[s] = 1;
	d[s] = 0;
 
	int x;
	while(!q.empty())
	{
		x = q.top();
		f[x] = 0;
		q.pop();
		for(auto i : g[x])
			if(d[x] + i.cost < d[i.id])
			{
				d[i.id] = d[x] + i.cost;
				if(f[i.id] == 0)
					q.push(i.id),
					f[i.id] = 1;
			}
	}
}

void solve()
{
	for(int i = 0; i < (1<<k); ++i)
		for(int j = 0; j < k; ++j)
			dp[i][j] = oo;
	dp[1][0] = 0;
	for(int i = 0; i < (1<<k); ++i)
		for(int j = 0; j < k; ++j)
			if(i & (1<<j))
				for(auto p : g2[j])
					if(i & (1<<p))
						dp[i][j] = min(dp[i][j], dp[i ^ (1<<j)][p] + dist[p][j]);
}

void afis()
{
	long long sol = oo;
	for(auto i : g2[0])
		sol = min(sol, dp[(1<<k) - 1][i]);
	out << sol;
}

int main()
{
	read();
	for(int i = 0; i < k; ++i)
		for(int j = 0; j < k; ++j)
			dist[i][j] = oo;
	for(int i = 1; i <= k; ++i)
	{
		dijkstra(c[i]);
		for(int j = 1; j <= k; ++j)
		{
			dist[i-1][j-1] = d[c[j]];
			if(dist[i-1][j-1] != oo)
				g2[i-1].push_back(j-1),
				g2[j-1].push_back(i-1);
		}
	}
	solve();
	afis();
	return 0;
}