Pagini recente » Cod sursa (job #2933090) | Cod sursa (job #1435402) | Cod sursa (job #2074818) | Cod sursa (job #1302895) | Cod sursa (job #1780648)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N=2005,K=20;
const long long Inf=(1ll<<60);
int n,m,k,a,b,c,v[K],mat[K][N],pos[N];
bool check[N],sem;
long long dist[N],d[(1<<K)][K];
struct ii{
long long dist;
int nod;
};
struct ij{
int dist,nod;
};
struct cmp{
bool operator() (ii &a,ii &b){
return a.dist>b.dist;
}
};
vector <ij> G[N];
priority_queue< ii, vector<ii>, cmp > pq;
void Dijkstra(int t){
int i,x,y;
long long d;
for(i=1;i<=n;i++) dist[i]=Inf;
dist[t]=0;
pq.push({0ll,t});
while(!pq.empty()){
d=pq.top().dist;
x=pq.top().nod;
pq.pop();
if(d>dist[x]) continue;
for(i=0;i<(int)G[x].size();i++){
y=G[x][i].nod;
d=G[x][i].dist;
if(dist[x]+d<dist[y]){
dist[y]=dist[x]+d;
pq.push({dist[y],y});
}
}
}
}
int main(){
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int i,j;
scanf("%d%d",&n,&m);
scanf("%d",&k);
for(i=0;i<k;i++){
scanf("%d",&v[i]);
if(v[i]==1 or v[i]==n){
i--, k--;
continue;
}
check[v[i]]=1;
pos[v[i]]=i;
}
/*v[k]=n, check[n]=1, pos[n]=k, k++;*/
for(i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
G[a].push_back({c,b});
G[b].push_back({c,a});
}
for(i=0;i<k;i++){
Dijkstra(v[i]);
for(j=1;j<=n;j++){
mat[i][j]=dist[j];
}
}
/// mat[i][j]= drumul minim de la nodul v[i] la nodul j;
int S=(1<<k)-1;
for(i=1;i<=S;i++)
for(j=0;j<k;j++)
d[i][j]=Inf;
for(i=0;i<k;i++)
d[(1<<i)][i]=1ll*mat[i][1];
for(i=1;i<=S;i++)
for(j=0;j<k;j++)
if(i&(1<<j))
for(int t=0;t<k;t++)
if(i&(1<<t) and t!=j)
d[i][j]=min(d[i][j],d[i^(1<<j)][t]+mat[t][v[j]]);
long long minn=Inf;
for(i=0;i<k;i++)
minn=min(minn, 1ll*d[S][i]+mat[i][n]);
printf("%lld\n",minn);
return 0;
}