Pagini recente » Cod sursa (job #2286410) | Cod sursa (job #1850520) | Cod sursa (job #893703) | Cod sursa (job #262916) | Cod sursa (job #604668)
Cod sursa(job #604668)
#include <cstdio>
#include <fstream>
#include <set>
#include <climits>
#include <algorithm>
#include <vector>
using namespace std;
#define f first
#define s second
#define mp make_pair
int n,m,k,c[16],pd[32768][16],srs[2001],pt[16][2001],i,j,l,kk,nc,sol;
vector<pair<int,int> >v[2001];
set<pair<int,int> >s;
void solve (int x,int *ss){
s.clear();
ss[x]=0;
s.insert(mp(ss[x],x));
for(i=1;i<=n;++i)
if(i!=x){
ss[i]=INT_MAX;
s.insert(mp(ss[i],i));
}
for(i=1;i<n;++i){
pair<int,int> tp=*s.begin();
s.erase(s.begin());
if(ss[tp.s]<tp.f)continue;
for(vector<pair<int,int> >::iterator it=v[tp.s].begin();it<v[tp.s].end();++it)
if(ss[it->f]>ss[tp.s]+it->s){
ss[it->f]=ss[tp.s]+it->s;
s.insert(mp(ss[it->f],it->f));
}
}
}
int main ()
{
ifstream in ("ubuntzei.in");
freopen ("ubuntzei.out","w",stdout);
in>>n>>m>>k;
for(i=0;i<k;++i)
in>>c[i];
for(;m;--m){
in>>i>>j>>l;
v[i].push_back(mp(j,l));
v[j].push_back(mp(i,l));
}
solve(1,srs),l=1<<k;
if(k==0)
printf("%d",srs[n]);
else{
for(i=0;i<k;++i)
solve(c[i],pt[i]);
for(i=1;i<l;++i){
for(j=0;j<k;++j)
if(i==(1<<j))
break;
if(j<k&&i==(1<<j)){
pd[i][j]=srs[c[j]];
continue;}
for(j=0;j<k;++j){
pd[i][j]=INT_MAX;
if((i&(1<<j))!=0)
for(kk=0;kk<k;++kk)
if(k!=j&&((i&(1<<kk))!=0)){
nc=pd[i-(1<<j)][kk]+pt[kk][c[j]];
pd[i][j]=min(pd[i][j],nc);
}
}
}
}
sol=INT_MAX;
for(i=0;i<k;++i)
sol=min(sol,pd[(1<<k)-1][i]+pt[i][n]);
printf("%d",sol);
return 0;}