Cod sursa(job #2297777)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 6 decembrie 2018 15:52:39
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
vector<pair<int,int>> v[2002];
int a[20],c[20][2002],dp[(1<<17)+2][18];
priority_queue<pair<int,int>> h;
void dij(int st)
{
	int nr=a[st],nr1,nr2;
	h.push({0,nr});
	while(!h.empty())
	{
		while(!h.empty()&&c[st][h.top().y]>0)
			h.pop();
		if(h.empty())
			return;
		nr1=h.top().y;nr2=-h.top().x;
		h.pop();
		c[st][nr1]=nr2;
		for(auto it:v[nr1])
			if(it.y!=nr&&(c[st][it.y]==0||c[st][it.y]<-nr2-it.x))
			{
				c[st][it.y]=-nr2-it.x;
				h.push({c[st][it.y],it.y});
			}
	}
}
int main()
{
    int n,m,k,i,j,nr,nr1,nr2;
	in>>n>>m>>k;k++;
	for(i=1;i<k;i++)
		in>>a[i];
	a[0]=1;a[k++]=n;
	for(i=0;i<m;i++)
	{
		in>>nr1>>nr2>>nr;
		v[nr1].push_back({nr,nr2});
		v[nr2].push_back({nr,nr1});
	}
	for(i=0;i<k;i++)
		dij(i);
	for(i=3;i<(1<<k);i++)
		for(j=1;j<k;j++)
			dp[i][j]=1<<28;
	for(i=1;i<(1<<k);i++)
		if(i&1)
			for(j=0;j<k;j++)
				if((i&(1<<j))&&(j||i==1))
					for(nr=0;nr<k;nr++)
						if(!(i&(1<<nr)))
							dp[i+(1<<nr)][nr]=min(dp[i+(1<<nr)][nr],dp[i][j]+c[j][a[nr]]);
	out<<dp[(1<<k)-1][k-1];
	return 0;
}