Pagini recente » Cod sursa (job #3228485) | Cod sursa (job #2883160) | Cod sursa (job #2349208) | Clasament FMI No Stress 2012 | Cod sursa (job #1162606)
#include <cstdio>
#include <utility>
#include <vector>
#include <queue>
#include <algorithm>
#include <limits>
typedef std::pair<unsigned, unsigned> PUU;
const unsigned INF=std::numeric_limits<unsigned>::max()/2;
unsigned n,m,k;
std::vector<short> subset;
std::vector<unsigned short> subsetid;
std::vector<std::vector<unsigned> > distg;
void dijkstra_modified(unsigned source, std::vector<unsigned> &dest, const std::vector<std::vector<PUU> > &Pre){
std::vector<unsigned> dist(n+1,INF);
dist[source]=0;
std::priority_queue<PUU,std::vector<PUU>,std::greater<PUU> > q;
for(unsigned i=0;i<Pre[source].size();++i){
q.push(PUU(Pre[source][i].second,Pre[source][i].first));
dist[Pre[source][i].first]=Pre[source][i].second;
}
while(!q.empty()){
unsigned c=q.top().first, n=q.top().second; q.pop();
if(dist[n]==c&&subsetid[n]==0)
for(unsigned i=0;i<Pre[n].size();++i)
if(dist[Pre[n][i].first]>c+Pre[n][i].second){
dist[Pre[n][i].first]=c+Pre[n][i].second;
q.push(PUU(dist[Pre[n][i].first],Pre[n][i].first));
}
}
dest.swap(dist);
}
void dijkstra_init(){
std::vector<std::vector<PUU> > Pre(n+1);
for(unsigned i=0;i<m;++i){
unsigned a,b,c; scanf("%u %u %u",&a,&b,&c);
Pre[a].push_back(PUU(b,c)); Pre[b].push_back(PUU(a,c));
}
distg.resize(k+3,std::vector<unsigned>(k+3,INF));
std::vector<unsigned> dist;
for(unsigned i=1;i<=k+2;++i){
dijkstra_modified(subset[i],dist,Pre);
for(unsigned j=i+1;j<=k+2;++j)
if(dist[subset[j]]!=INF){
distg[i][j]=dist[subset[j]];
distg[j][i]=dist[subset[j]];
}
}
}
unsigned getdist(){
std::vector<std::vector<unsigned> > dp(k+3 ,std::vector<unsigned>(1<<(k+2),INF));
dp[1][1]=0;
for(unsigned s=1;s<(1u<<(k+2));++s){
for(unsigned i=1;i<=k+2;++i)
for(unsigned j=1;j<=k+2;++j) if( 1&(s>>(j-1)) )
if(distg[j][i]!=INF){
dp[i][s|(1<<(i-1))]=std::min(dp[i][s|(1<<(i-1))], dp[j][s]+distg[j][i]);
}
}
return dp[k+2][(1<<(k+2))-1];
}
int main(){
std::freopen("ubuntzei.in","r",stdin);
std::freopen("ubuntzei.out","w",stdout);
std::scanf("%u %u %u",&n,&m,&k);
subset.resize(k+3); subsetid.resize(n+1,0);
subset[1]=1; subset[k+2]=n;
subsetid[1]=1; subsetid[n]=k+2;
for(unsigned i=2;i<k+2;++i){
std::scanf("%hu",&subset[i]);
subsetid[subset[i]]=i;
}
dijkstra_init();
unsigned L=getdist();
printf("%u\n",L);
}