Pagini recente » Cod sursa (job #962483) | Cod sursa (job #2943713) | Cod sursa (job #1366956) | Cod sursa (job #2292325) | Cod sursa (job #2022911)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <set>
#define c second
#define d first
#define INF 999999999
using namespace std;
ifstream si("ubuntzei.in");
ofstream so("ubuntzei.out");
vector<pair<int,int> > g[2005];
bitset<2005> l;
set<pair<int,int> > q;
int x[16];
int surs[2005];
int d[20][2005];
int pd[33000][25];
int n;
void dij(int s, int sol[])
{
int vc;
for(int i=1;i<=n;++i)
sol[i]=INF;
sol[s]=0;
q.clear();
for(int i=1;i<=n;++i)
q.insert(make_pair(sol[i],i));
for(int i=1;i<n;++i)
{
pair<int,int> top=*q.begin();
q.erase(q.begin());
int nod=top.c;
if(sol[nod]<top.d) continue;
for(int j=0;j<g[nod].size();++j)
if(sol[vc=g[nod][j].d]>sol[nod]+g[nod][j].c)
{
sol[vc]=sol[nod]+g[nod][j].c;
q.insert(make_pair(sol[vc],vc));
}
}
}
int main()
{
int m;
si>>n>>m;
int k;
si>>k;
for(int i=0;i<k;++i)
{
si>>x[i];
}
int a,b,c;
for(int i=1;i<=m;++i)
{
si>>a>>b>>c;
g[a].push_back(make_pair(b,c));
g[b].push_back(make_pair(a,c));
}
dij(1,surs);
if(k==0)
{
cout<<surs[n];
return 0;
}
for(int i=0;i<k;++i)
dij(x[i],d[i]);
for(int i=1;i<(1<<k);++i)
{
int j;
for(j=0;j<k;++j)
if(i==(1<<j))
break;
if(j<k&&i==(1<<j))
{
pd[i][j]=surs[x[j]];
continue;
}
for(j=0;j<k;++j)
{
pd[i][j]=INF;
if(i&(1<<j))
for(int l=0;l<k;++l)
if(l!=j&&(i&(1<<l)))
{
pd[i][j]=min(pd[i][j],pd[i-(1<<j)][k]+d[k][x[j]]);
}
}
}
int bst=INF;
for(int i=0;i<k;++i)
bst=min(bst,pd[(1<<k)-1][i]+d[i][n]);
so<<bst<<'\n';
return 0;
}