Cod sursa(job #2340637)

Utilizator vladcoroian2001Vlad Coroian vladcoroian2001 Data 10 februarie 2019 19:23:46
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#include <cstring>
using namespace std;
ifstream fi("ubuntzei.in");
ofstream fo("ubuntzei.out");
const int NMAX=2005,INF=1e9;
int n,m,k,u[20],bst[NMAX][NMAX],x,y,cost,VIZ[NMAX],dp[20][(1<<16)+5];
priority_queue <pair <int,int>> pq;
vector <pair<int,int>> V[NMAX];
void dijkstra(int s)
{
	memset(VIZ,0,sizeof(VIZ));
	for(int i=1;i<=n;i++)
		bst[s][i]=INF;
	pq.push({0,s});
	bst[s][s]=0;
	while(!pq.empty())
	{
		auto p=pq.top();
		pq.pop();
		int x=p.second;
		if(VIZ[x]) continue;
		VIZ[x]=1; 
		for(auto edge: V[x])
		{
			y=edge.first;
			cost=edge.second;
			if(bst[s][y]>bst[s][x]+cost)
			{
				bst[s][y]=bst[s][x]+cost;
				VIZ[y]=0;
				pq.push({-bst[s][y],y});
			}
		}
	}
}
int main()
{
	fi>>n>>m>>k;
	for(int i=0;i<k;i++)
	{
		fi>>x;
		u[i]=x;
	}
	for(int i=1;i<=m;i++)
	{
		fi>>x>>y>>cost;
		V[x].push_back({y,cost});
		V[y].push_back({x,cost});
	}
	dijkstra(1);
	for(int i=0;i<k;i++)
	{
		dijkstra(u[i]);
		dp[i][(1<<i)]=bst[u[i]][1];
	}
	for(int conf=0;conf<(1<<k);conf++)
		for(int i=0;i<k;i++)
			if(conf&(1<<i) && (conf-(1<<i))!=0)
			{
				dp[i][conf]=INF;
				for(int j=0;j<k;j++)
					if(j!=i && bst[u[i]][u[j]]!=INF && conf&(1<<j))
						dp[i][conf]=min(dp[i][conf],dp[j][conf-(1<<i)]+bst[u[i]][u[j]]);
			}
	int rez=INF;
	if(!k) rez=bst[1][n];
	for(int i=0;i<k;i++)
		if(bst[u[i]][n]!=INF)
			rez=min(rez,dp[i][(1<<k)-1]+bst[u[i]][n]);
	fo<<rez<<"\n";
	fi.close();
	fo.close();
	return 0;
}