Cod sursa(job #2271415)

Utilizator shantih1Alex S Hill shantih1 Data 28 octombrie 2018 15:38:20
Problema Ubuntzei Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <set>
#define inf 2147483647
#define fi first
#define se second

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

int n,m,k,i,j,nr;
int c[20],dr[20][20],id[2005],dis[2005];
int rz[70000][20];
vector<pair<int, int>> ad[2005];
set<pair<int, int>> qset;
struct nod
{	int m,nd,c;	
	bool operator<(const nod &alt)const
	{	return c>alt.c;	}
};
priority_queue<nod> pq;

void dijkstra(int nd)
{
	int i,x,y;
	for(i=1;i<=n;i++)
		dis[i]=0;
 
	qset.insert({0, nd});
	dis[nd]=0;
	while(!qset.empty())
	{
		y=qset.begin()->fi;
		x=qset.begin()->se;
		qset.erase(qset.begin());
		if(y<dis[x])	continue;
		
		dr[id[nd]][id[x]]=min(dr[id[nd]][id[x]], y);
		for(auto i: ad[x])
			if(dis[i.fi]==0 || y+i.se<dis[i.fi])
			{
				dis[i.fi]=y+i.se;
				qset.insert({y+i.se, i.fi});
			}
	}
}
int main () {
	
	fin>>n>>m;
	fin>>k;
	c[++nr]=1;
	for(i=1;i<=k;i++)
		fin>>c[++nr];
	c[++nr]=n;
	k=nr;
	for(i=1;i<=k;i++)
		id[c[i]]=i;
	
	while(m--)
	{
		fin>>i>>j>>nr;
		ad[i].push_back({j,nr});
		ad[j].push_back({i,nr});
	}
	
	for(i=1;i<=k;i++)
		for(j=1;j<=k;j++)
			dr[i][j]=inf;
	
	for(i=1;i<=k;i++)
		dijkstra(c[i]);
	
	for(i=1;i<=n;i++)
		while(!ad[i].empty())	ad[i].pop_back();
	
	for(i=1;i<=k;i++)
		for(j=1;j<=k;j++)
			if(i!=j)
				ad[i].push_back({j, dr[i][j]});
	
	int l=(1<<(k-1))-1,nd,m,c,m2;
	pq.push({0,1,1});
	rz[0][1]=1;
	while(!pq.empty())
	{
		m=pq.top().m;
		nd=pq.top().nd;
		c=pq.top().c;
		pq.pop();
		if(m==l)
		{
			if(nd==k)	
			{	fout<<c-1<<"\n";	return 0;	}
			else pq.push({m,n,c+dr[nd][k]});
			continue;
		}
		if(c<rz[m][nd])	continue;
		
		for(auto j:ad[nd])
		{
			m2=(j.first!=1)?m2=m|(1<<(j.first-2)):m;
			if(rz[m2][j.first]==0 || c+j.second<rz[m2][j.first])
			{
				rz[m2][j.first]=c+j.second;
				pq.push({m2,j.first,c+j.second});
			}
		}
	}
}