Pagini recente » Cod sursa (job #873727) | Cod sursa (job #1089218) | Cod sursa (job #3170494) | Cod sursa (job #2937865) | Cod sursa (job #1362895)
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#define NMAX 2001
#define KMAX 16
#define PMAX 1<<15
#define f first
#define s second
#define INF 1000000
#include<utility>
#include<cstring>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,vfmin;
vector<pair<int,int> >g[NMAX];
int dmn[KMAX][KMAX], bst[PMAX][KMAX],dmin[NMAX];
int ct[KMAX],pas;
class comparvf
{
public:
bool operator() (const int & x,const int &y)
{
return dmin[x]<dmin[y];
}
};
priority_queue<int,vector<int>,comparvf> h;
void read()
{ int x,y,c;
fin>>n>>m>>k;
ct[0]=1;
for(int i=1;i<=k;i++)
fin>>ct[i];
ct[k+1]=n;k=k+2;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>c;
g[x].push_back(make_pair(y,c));
g[y].push_back(make_pair(x,c));
}
fin.close();
}
void dijkstra(int i)
{ int cr=0;
pas=i; memset(dmin,INF,sizeof(dmin));
h.push(i);dmin[pas]=0;
while(!h.empty())
{ cr++;
vfmin=h.top();h.pop();//cout<<vfmin<<'\n';
for(int x=0;x<g[vfmin].size();++x)
{
if(dmin[g[vfmin][x].f]>dmin[vfmin]+g[vfmin][x].s)
{
dmin[g[vfmin][x].f]=dmin[vfmin]+g[vfmin][x].s;
h.push(g[vfmin][x].f);
}
}
}
}
void solve()
{ int cr=0;
memset(bst,INF,sizeof(bst));
bst[1][0]=0;
for(int i=1;i<(1<<k);i++)
for(int j=0;j<k;j++)
if(i&(1<<j))
for(int p=0;p<k;p++)
if(i & (1<<p))
{
bst[i][j]=min(bst[i][j],bst[i^(1<<j)][p]+dmn[p][j]);
}
fout<<bst[(1<<k)-1][k-1];
}
int main()
{
read();
for(int i=0;i<k;i++)
{dijkstra(ct[i]);
for(int j=0;j<k;++j)
dmn[i][j]=dmin[ct[j]];
dmn[i][i]=0;
}
solve();
fout.close();
return 0;
}