Pagini recente » Cod sursa (job #2174474) | Rating Laura Ghimpeteanu (ghimpeteanulaura) | Cod sursa (job #2334812) | Cod sursa (job #2007959) | Cod sursa (job #2682745)
#include <fstream>
#include <queue>
#define inf 9223372036854775806
#include <vector>
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
long long dp[33000], dij[2010][2010];
long long d[2010];
bool ok[2010];
vector <pair<int,int> > G[2010];
int N,M,K, P[20];
struct compare {
bool operator() (int x,int y) {
return d[x]>d[y];
} };
priority_queue <int, vector<int>, compare> q;
int daicstra(int nod);
void scan();
int main()
{
scan();
for(int i=1; i<=N; ++i)
d[i]=inf;
if(K==0) {
d[1]=0;
daicstra(1);
cout<<d[N]<<'\n';
return 0;
}
for(int i=1; i<N; ++i)
{
d[i]=0;
daicstra(i);
for(int j=1; j<=N; ++j)
if(i!=j && !dij[i][j])
dij[i][j]=dij[j][i]=d[j], d[j]=inf, ok[j]=0;
}
/*
for(int i=1; i<=N; ++i, cout<<'\n')
for(int j=1; j<=N; ++j)
cout<<dij[i][j]<<' ';
*/
int config, ind=0,newcon=0, ind1=0;
for(config=1; config<(1<<K); ++config)
if((config&(config-1))!=0)
{
dp[newcon]=inf;
for(ind=0; ind<K; ++ind)
if(((1<<ind)&config)==0)
{
newcon=config|(1<<ind);
for(ind1=0; ind1<K; ++ind1)
if(((1<<ind)&config)!=0)
dp[newcon]=min(dp[newcon],dp[config]+dij[ind][P[ind1]]);
}
}
else for(ind=0; ind<K; ++ind)
if(config==(1<<ind))
{
dp[config]=dij[1][P[ind]];
break;
}
long long ans=dp[(1<<K)-1]+100000;
for(ind1=0; ind1<K; ++ind1)
ans=min(ans,dp[(1<<K)-1]+dij[P[ind1]][N]);
cout<<ans<<'\n';
return 0;
}
void scan()
{
int x,y,z;
cin>>N>>M>>K;
for(int i=0; i<K; ++i)
cin>>P[i];
for(int i=1; i<=M; ++i)
{
cin>>x>>y>>z;
G[x].push_back({y,z});
G[y].push_back({x,z});
}
}
int daicstra(int nod)
{
int nr=0, im=0, lg=0, ox ,oc;
pair <int,int> el;
nr=1;
q.push(nod);
ok[nod]=1;
while(!q.empty())
{
im=q.top(); q.pop();
ok[im]=0;
for(auto it: G[im])
{
ox=it.first;
oc=it.second;
if(oc+d[im]<d[ox])
{
d[ox]=d[im]+oc;
if(!ok[ox])
{
q.push(ox);
ok[ox]=1;
}
}
}
}
}