Pagini recente » Cod sursa (job #2731334) | Cod sursa (job #619719) | Cod sursa (job #2712792) | Cod sursa (job #1641470) | Cod sursa (job #2560724)
#include <bits/stdc++.h>
#define Dim 2020
#define Lim (1<<16)+10
#define oo 1e9+1
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int N,M,K,a,b,c,dp[Lim][Dim],ans=-1,Poz[Dim],ras;
bool Frd[Dim],viz[Lim][Dim];
struct edge
{
int ver,pay;
};
vector < edge > V[Dim];
struct coada
{
int mlt,vrt;
};
void Bell()
{
queue < coada > qu;
viz[0][1]=1;
qu.push({0,1});
dp[0][1]=0;
while(!qu.empty())
{
int nod=qu.front().vrt;
int multime=qu.front().mlt;
viz[multime][nod]=0;
qu.pop();
if( dp[multime][nod] > dp[ras][N] ) continue;
for(unsigned int i=0;i<V[nod].size();i++)
{
int vecin = V[nod][i].ver;
int cost = V[nod][i].pay;
if( dp[multime][nod] + cost < dp[multime][vecin] )
{
dp[multime][vecin]=dp[multime][nod] + cost;
if( !viz[multime][vecin] )
{
viz[multime][vecin]=1;
qu.push({multime,vecin});
}
}
if( Frd[vecin] && ( multime & ( 1 << Poz[vecin] ) ) == 0 )
{
if( dp[multime][nod] + cost < dp[( multime ^ ( 1 << Poz[vecin] ) ) ][vecin] )
{
dp[( multime ^ ( 1 << Poz[vecin] ) )][vecin]=dp[multime][nod] + cost;
if( !viz[( multime ^ ( 1 << Poz[vecin] ) )][vecin] )
{
viz[( multime ^ ( 1 << Poz[vecin] ) )][vecin]=1;
qu.push({( multime ^ ( 1 << Poz[vecin] ) ),vecin});
}
}
}
}
}
}
int main()
{
f>>N>>M>>K;
for(int i=1;i<=K;i++)
{
f>>a;
Frd[a]=1;
Poz[a]=i;
}
for(int i=1;i<=M;i++)
{
f>>a>>b>>c;
V[a].push_back({b,c});
V[b].push_back({a,c});
}
for(int i=0;i<(1<<(K+1));i++)
for(int j=1;j<=N;j++) dp[i][j]=oo;
for(int i=1;i<=K;i++) ras=ras^(1<<i);
Bell();
g<<dp[ras][N];
return 0;
}