Cod sursa(job #2271383)

Utilizator shantih1Alex S Hill shantih1 Data 28 octombrie 2018 14:53:31
Problema Ubuntzei Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 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[132000][20];
vector<pair<int, int>> ad[2005];
multiset<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,nd,m,c,m2;
	pq.push({1,1,1});
	rz[0][1]=1;
	while(!pq.empty())
	{
		m=pq.top().m;
		nd=pq.top().nd;
		c=pq.top().c;
		pq.pop();
		if(nd==k && m==l)
		{	fout<<c-1<<"\n";	return 0;	}
		if(c<rz[m][nd])	continue;
		
		for(auto j:ad[nd])
		{
			m2=m|(1<<(j.fi-1));
			if(rz[m2][j.fi]==0 || c+j.se<rz[m2][j.fi])
			{
				rz[m2][j.fi]=c+j.se;
				pq.push({m2,j.fi,c+j.se});
			}
		}
	}
}