Pagini recente » Cod sursa (job #1486830) | Cod sursa (job #1860662) | Cod sursa (job #3157417) | Cod sursa (job #562319) | Cod sursa (job #3198408)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define inf 10000001
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,v[16],d[32768][16],dist[16][16],disti[16],distf[16],x,y,z,dp[2001],distif;
struct muchie
{
int nod,cost;
};
vector <muchie> A[2001];
struct cmp
{
bool operator () (const muchie& a, const muchie& b )
{
return a.cost>b.cost;
}
};
void distanta(int nod,int tip,int nr)
{
priority_queue <muchie, vector<muchie> ,cmp> q;
q.push({nod,0});
for(int i=1;i<=n;i++)
dp[i]=inf;
dp[nod]=0;
while(!q.empty())
{
muchie nodc=q.top();
q.pop();
int x=nodc.nod;
int dist=nodc.cost;
if(dist!=dp[x])
continue;
for(auto i:A[x])
{
if(dp[i.nod]>dp[x]+i.cost)
{
dp[i.nod]=dp[x]+i.cost;
q.push({i.nod,dp[i.nod]});
}
}
}
for(int i=1;i<=k;i++)
{
if(nod!=v[i])
{
if(tip==0){
dist[i][nr]=dp[v[i]];
dist[nr][i]=dp[v[i]];
}
else if(tip==1)
{
disti[i]=dp[v[i]];
}
else{
distf[i]=dp[v[i]];
}
}
}
if(tip==1){
distif=dp[n];
}
}
int main()
{
fin>>n>>m;
fin>>k;
for(int i=1;i<=k;i++)
{
fin>>v[i];
}
for(int i=1;i<=m;i++)
{
fin>>x>>y>>z;
A[x].push_back({y,z});
A[y].push_back({x,z});
}
distanta(1,1,0);
distanta(n,2,0);
for(int i=1;i<=k;i++)
distanta(v[i],0,i);
int l=(1<<k)-1;
for(int i=1;i<=l;i++)
{
for(int p=1;p<=k;p++)
d[i][p]=inf;
}
for(int i=1;i<=k;i++)
{
d[(1<<(i-1))][i]=disti[i];
}
for(int i=1;i<=l;i++)
{
for(int p=1;p<=k;p++)
{
if((i>>(p-1))&1)
{
for(int p2=1;p2<=k;p2++)
{
if(!((i>>(p2-1))&1))
{
int j=i+(1<<(p2-1));
d[j][p2]=min(d[j][p2],d[i][p]+dist[p][p2]);
}
}
}
}
}
int minim=inf;
for(int i=1;i<=k;i++)
{
minim=min(minim,d[l][i]+distf[i]);
}
if(k==0)
{
minim=distif;
}
fout<<minim;
return 0;
}