Cod sursa(job #2336116)

Utilizator danielsociuSociu Daniel danielsociu Data 4 februarie 2019 20:01:00
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
#define maxn 2002
#define pb push_back
#define f first
#define s second
const int inf=0x3f3f3f3f;

int n,m,k,v[maxn],dj[maxn],c[maxn],d[17][17],SOL[(1<<17)][17];
vector<pair<int,int>> g[maxn];
queue<int> q;
inline int min(int a,int b){if(a<b)return a; return b;}
void dijk(int);

int main()
{
	int i,x,y,cos,cmb,excluded;
	cin>>n>>m>>k;
	for(i=1;i<=k;++i)
		cin>>i[c];
	for(;m--;){
		cin>>x>>y>>cos;
		g[x].pb({y,cos});
		g[y].pb({x,cos});
	}
	if(!k){
		dijk(1);
		cout<<dj[n];
		return 0;
	}
	++k;
	c[0]=1,c[k]=n;
	for(i=0;i<=k;++i){
		dijk(c[i]);
		for(x=0;x<=k;++x)
			d[i][x]=dj[c[x]];
	}
	--k;
	cmb=(1<<k);
	for(x=0;x<=cmb;++x)
		for(i=0;i<=k;++i)
			SOL[x][i]=inf;
	SOL[0][0]=0;
	for(x=1;x<cmb;++x)
		for(i=0;i<k;++i)
			if(x&(1<<i))
				for(y=0,excluded=(x-(1<<i));y<=k;++y)
					SOL[x][i+1]=min(SOL[x][i+1],SOL[excluded][y]+d[y][i+1]);
	int sol=inf;
	for(i=1;i<=k;++i)
	 if(sol>SOL[x-1][i]+d[i][k+1])
	 	sol=SOL[x-1][i]+d[i][k+1];
	cout<<sol;
}

void dijk(int x){
	int nod,i;
	q.push(x);
	for(i=1;i<=n;++i)
		i[dj]=inf;
	x[dj]=0;
	while(!q.empty()){
		nod=q.front();
		q.pop();
		for(auto it:g[nod])
			if(dj[it.f]>nod[dj]+it.s)
				dj[it.f]=*(nod+dj) + it.s, q.push(it.f);
	}
}