Cod sursa(job #2644226)

Utilizator sebimihMihalache Sebastian sebimih Data 23 august 2020 21:27:14
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <limits.h>
#include <set>
#include <algorithm>

using namespace std;

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

const int N = 2005, inf = INT_MAX, MaxPrieteni = 20;

vector<pair<int, int>> g[N];
int OrasDeVizitat[MaxPrieteni];
int n, m, k, CostMin[N][N];

void Init()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			CostMin[i][j] = inf;
		}
	}
}

void Dijkstra(int start)
{
	set<pair<int, int>> heap;	// cost spre nod
	heap.insert({ 0, start });
	CostMin[start][start] = 0;

	while (!heap.empty())
	{
		int nod = heap.begin()->second;
		int cost = heap.begin()->first;
		heap.erase(heap.begin());

		for (auto neigh : g[nod])
		{
			int NextNod = neigh.first;
			int NextCost = neigh.second;

			if (cost + NextCost < CostMin[start][NextNod])
			{
				if (CostMin[start][NextNod] != inf)
				{
					heap.erase(heap.find({ CostMin[start][NextNod], NextNod }));
				}

				CostMin[start][NextNod] = cost + NextCost;
				heap.insert({ CostMin[start][NextNod], NextNod });
			}
		}
	}
}

int main()
{
	fin >> n >> m >> k;

	OrasDeVizitat[0] = 1;
	for (int i = 1; i <= k; i++)
	{
		fin >> OrasDeVizitat[i];
	}

	for (int i = 0; i < m; i++)
	{
		int x, y, cost;
		fin >> x >> y >> cost;
		g[x].push_back({ y, cost });
		g[y].push_back({ x, cost });
	}

	Init();

	for (int i = 0; i <= k; i++)
	{
		Dijkstra(OrasDeVizitat[i]);
	}

	int lim = 1 << (k + 1);
	vector<vector<int>> dp(lim, vector<int>(k + 1, inf));
	dp[1][0] = 0;

	for (int mask = 3; mask < lim; mask += 2)
	{
		for (int i = 1; i <= k; i++)
		{
			if (mask & (1 << i))
			{
				for (int j = 0; j <= k; j++)
				{
					if (i != j && (mask & (1 << j)))
					{
						if (dp[mask - (1 << i)][j] != inf)
						{
							dp[mask][i] = min(dp[mask][i], dp[mask - (1 << i)][j] + CostMin[OrasDeVizitat[j]][OrasDeVizitat[i]]);
						}
					}
				}
			}
		}
	}

	int ans = inf;
	for (int i = 0; i <= k; i++)
	{
		if (dp[lim - 1][i] != inf)
		{
			ans = min(ans, dp[lim - 1][i] + CostMin[OrasDeVizitat[i]][n]);
		}
	}

	fout << ans;
}