Pagini recente » Istoria paginii runda/simulare_oji_bv_11-12 | Cod sursa (job #1562817) | Cod sursa (job #2873707) | Cod sursa (job #1315284) | Cod sursa (job #1113838)
#include<cstdio>
#include<vector>
#include<queue>
#define nrmare 1999999999
using namespace std;
int n,m,k[20],kk,dist[20][2005],viz[2005],nr,sol[1<<17][20],num;
struct point
{
int p,ct;
};
vector<point>v[2005];
queue<int>q;
point makenod(int y,int z)
{
point t;
t.p=y;
t.ct=z;
return t;
}
void citire()
{
int x,y,z;
scanf("%d%d",&n,&m);
scanf("%d",&kk);
k[1]=1;
for(int i=2;i<=kk+1;i++)
scanf("%d",&k[i]);
k[kk+2]=n;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
v[x].push_back(makenod(y,z));
v[y].push_back(makenod(x,z));
}
}
void dijkstra(int x)
{
while(!q.empty())
{
x=q.front();
for(int i=0;i<v[x].size();i++)
{
if(dist[nr][x]+v[x][i].ct<dist[nr][v[x][i].p])
{
dist[nr][v[x][i].p]=dist[nr][x]+v[x][i].ct;
if(viz[v[x][i].p]==0)
{
q.push(v[x][i].p);
viz[v[x][i].p]=1;
}
}
}
viz[x]=0;
q.pop();
}
}
void mare1()
{
for(int i=1;i<=kk+2;i++)
for(int j=1;j<=n;j++)
if(k[i]!=j)
dist[i][j]=nrmare;
else
dist[i][j]=0;
}
void mare2()
{
for(int i=1;i<=n;i++)
viz[i]=0;
}
void mare3()
{
for(int i=1;i<=((1<<17)-1);i++)
for(int j=1;j<=kk+2;j++)
sol[i][j]=nrmare;
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
citire();
mare1();
for(nr=1;nr<=kk+2;nr++)
{
mare2();
q.push(k[nr]);
viz[k[nr]]=1;
dijkstra(k[nr]);
}
sol[1][1]=0;
mare3();
for(int i=2;i<=(1<<(kk+2))-1;i++)
for(int j=1;j<=kk+2;j++)
{
if((i & (1<<(j-1)))!=0)
{
num=v[k[j]].size();
for(int u=0;u<num;u++)
{
for(int t=1;t<=kk+2;t++)
{
if(v[k[j]][u].p==k[t])
{
if((i & (1<<(t-1)))!=0)
if(sol[i][j]>sol[i^(1<<(j-1))][v[k[j]][u].p]+dist[t][j])
sol[i][j]=sol[i^(1<<(j-1))][v[k[j]][u].p]+dist[t][j];
}
}
}
}
}
printf("%d",sol[(1<<(kk+2))-1][kk+2]);
return 0;
}