Pagini recente » Cod sursa (job #1556385) | Cod sursa (job #1936291) | Cod sursa (job #1337105) | Cod sursa (job #280810) | Cod sursa (job #2130398)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <deque>
#define INF 2140000000
#define MOD 1000000007
#define MaxN 2005
#define MaxK 16
using namespace std;
FILE*IN=fopen("ubuntzei.in","r"),*OUT=fopen("ubuntzei.out","w");
int dist[MaxK][MaxK],depth[MaxN],d[MaxK][1<<MaxK],spec[MaxK],N,M,K;
vector <pair<int,int> >Graph[MaxN];
queue<int> Q;
void BFS(int node)
{
for(int i=1;i<=N;i++)
depth[i]=INF;
depth[node]=0;
Q.push(node);
while(!Q.empty())
{
node=Q.front();
Q.pop();
for(int i=0;i<Graph[node].size();i++)
{
if(depth[Graph[node][i].first]>Graph[node][i].second+depth[node])
{
depth[Graph[node][i].first]=Graph[node][i].second+depth[node];
Q.push(Graph[node][i].first);
}
}
}
}
int main()
{
fscanf(IN,"%d%d%d",&N,&M,&K);
for(int i=0;i<K;i++)
fscanf(IN,"%d",&spec[i]);
for(int i=1;i<=M;i++)
{
int X,Y,Z;
fscanf(IN,"%d%d%d",&X,&Y,&Z);
Graph[X].push_back({Y,Z});
Graph[Y].push_back({X,Z});
}
BFS(1);
if(K==0)
{
fprintf(OUT,"%d",depth[N]);
return 0;
}
for(int i=0;i<K;i++)
d[i][1<<i]=depth[spec[i]];
for(int i=0;i<K;i++)
{
BFS(spec[i]);
for(int j=0;j<K;j++)
dist[i][j]=depth[spec[j]];
}
for(int i=1;i<(1<<K);i++)
for(int j=0;j<K;j++)
{
if((1<<j)&i)
{
if((1<<j)^i)
d[j][i]=INF;
int p=i^(1<<j);
for(int k=0;k<K;k++)
if((1<<k)&p)
d[j][i]=min(d[j][i],dist[j][k]+d[k][p]);
}
}
BFS(N);
for(int i=0;i<K;i++)
d[i][(1<<K)-1]+=depth[spec[i]];
int Min=INF;
for(int i=0;i<K;i++)
Min=min(Min,d[i][(1<<K)-1]);
fprintf(OUT,"%d",Min);
return 0;
}