Cod sursa(job #2396068)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 3 aprilie 2019 10:44:56
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <vector>
#include <queue>
#define x first
#define y second
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,d[17][17],d2[2005],v2[2005],din[65537*2][17],i,j,x,y,cost,cmb,msk,i2;
vector<pair<int,int> >v[2005];
queue<int>q;
void bfs(int x)
{
	int nod,i;
	q.push(x);
	for(i=1; i<=n; i++)
	{
		d2[i]=1000000000;
	}
	d2[x]=0;
	while(!q.empty())
	{
		nod=q.front();
		q.pop();
		for(auto it:v[nod])
		{
			if(d2[it.x]>d2[nod]+it.y)
			{
				d2[it.x]=*(nod+d2)+it.y;
				q.push(it.x);
			}
		}
	}
}
int main()
{
	f>>n>>m>>k;
	for(i=1; i<=k; ++i)
	{
		f>>v2[i];
	}
	while(m--)
	{
		f>>x>>y>>cost;
		v[x].push_back({y,cost});
		v[y].push_back({x,cost});
	}
	if(!k)
	{
		bfs(1);
		g<<d2[n];
		return 0;
	}
	k++;
	v2[0]=1;
	v2[k]=n;
	for(i=0; i<=k; i++)
	{
		bfs(v2[i]);
		for(j=0; j<=k; j++)
		{
			d[i][j]=d2[v2[j]];
		}
	}
	k--;
	cmb=(1<<k);
	for(i=0; i<=cmb; i++)
	{
		for(j=0; j<=k; j++)
		{
			din[i][j]=1000000000;
		}
	}
	din[0][0]=0;
	for(i=1; i<cmb; i++)
	{
		for(j=0; j<k; j++)
		{
			if(i&(1<<j))
			{
				for(i2=0,msk=(i-(1<<j)); i2<=k; i2++)
				{
					din[i][j+1]=min(din[i][j+1],din[msk][i2]+d[i2][j+1]);
				}
			}
		}
	}
	int rasp=1000000000;
	for(i=1; i<=k; ++i)
	{
		if(rasp>din[cmb-1][i]+d[i][k+1])
		{
			rasp=din[cmb-1][i]+d[i][k+1];
		}
	}
	g<<rasp;
}