Pagini recente » Cod sursa (job #565660) | Cod sursa (job #41787) | Cod sursa (job #1142382) | Cod sursa (job #2002293) | Cod sursa (job #2396066)
#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]=1000000;
}
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]=1000000;
}
}
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=1000000;
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;
}