Pagini recente » Cod sursa (job #868005) | Cod sursa (job #68247) | Cod sursa (job #295033) | Cod sursa (job #2311570) | Cod sursa (job #2271383)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <set>
#define inf 2147483647
#define fi first
#define se second
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,i,j,nr;
int c[20],dr[20][20],id[2005],dis[2005];
int rz[132000][20];
vector<pair<int, int>> ad[2005];
multiset<pair<int, int>> qset;
struct nod
{ int m,nd,c;
bool operator<(const nod &alt)const
{ return c>alt.c; }
};
priority_queue<nod> pq;
void dijkstra(int nd)
{
int i,x,y;
for(i=1;i<=n;i++)
dis[i]=0;
qset.insert({0, nd});
dis[nd]=0;
while(!qset.empty())
{
y=qset.begin()->fi;
x=qset.begin()->se;
qset.erase(qset.begin());
if(y<dis[x]) continue;
dr[id[nd]][id[x]]=min(dr[id[nd]][id[x]], y);
for(auto i: ad[x])
if(dis[i.fi]==0 || y+i.se<dis[i.fi])
{
dis[i.fi]=y+i.se;
qset.insert({y+i.se, i.fi});
}
}
}
int main () {
fin>>n>>m;
fin>>k;
c[++nr]=1;
for(i=1;i<=k;i++)
fin>>c[++nr];
c[++nr]=n;
k=nr;
for(i=1;i<=k;i++)
id[c[i]]=i;
while(m--)
{
fin>>i>>j>>nr;
ad[i].push_back({j,nr});
ad[j].push_back({i,nr});
}
for(i=1;i<=k;i++)
for(j=1;j<=k;j++)
dr[i][j]=inf;
for(i=1;i<=k;i++)
dijkstra(c[i]);
for(i=1;i<=n;i++)
while(!ad[i].empty()) ad[i].pop_back();
for(i=1;i<=k;i++)
for(j=1;j<=k;j++)
if(i!=j)
ad[i].push_back({j, dr[i][j]});
int l=(1<<k)-1,nd,m,c,m2;
pq.push({1,1,1});
rz[0][1]=1;
while(!pq.empty())
{
m=pq.top().m;
nd=pq.top().nd;
c=pq.top().c;
pq.pop();
if(nd==k && m==l)
{ fout<<c-1<<"\n"; return 0; }
if(c<rz[m][nd]) continue;
for(auto j:ad[nd])
{
m2=m|(1<<(j.fi-1));
if(rz[m2][j.fi]==0 || c+j.se<rz[m2][j.fi])
{
rz[m2][j.fi]=c+j.se;
pq.push({m2,j.fi,c+j.se});
}
}
}
}