Pagini recente » Cod sursa (job #2485950) | Cod sursa (job #1721181) | Cod sursa (job #1098182) | Cod sursa (job #1906442) | Cod sursa (job #1247309)
#include <iostream>
#include <cstdio>
#define in "ubuntzei.in","r",stdin
#define out "ubuntzei.out","w",stdout
#define nmax 2005
#define Maxx 10005
#define kmax 1<<16
#define INF 9999999
#include <vector>
using namespace std;
int n,nr,u[20],m,dp[nmax][nmax],C[kmax][20];
vector<pair<int,int> >G[Maxx];
inline void djikstra(int x){
int i,k,j,Q[Maxx];
for(j=1;j<=n;j++)
dp[x][j] = INF;
dp[x][x] = 0;
Q[1]=x;
k=1;
for(i=1;i<=k;i++)
for(j=0;j<G[Q[i]].size();j++)
if(dp[x][G[Q[i]][j].first]==INF||(dp[x][G[Q[i]][j].first] > dp[x][Q[i]]+G[Q[i]][j].second)){
Q[++k]=G[Q[i]][j].first;
dp[x][Q[k]]=dp[x][Q[i]]+G[Q[i]][j].second;
}
}
inline void solve(){
int i,j,q,best;
for(i=0;i<(1<<nr);i++)
for(j=1;j<=nr;j++)
C[i][j] = INF;
for(i=1;i<=nr;i++)
C[1<<(i-1)][i] = dp[u[i]][1];
for(i=0;i<(1<<nr);i++)
for(j=1;j<=nr;j++)
for(q=1;q<=nr;q++){
C[i][j]=min(C[i][j],C[i^(1<<(j-1))][q]+dp[u[q]][u[j]]);
}
best=INF;
for(i=1;i<=nr;i++)
best=min(best,C[(1<<nr)-1][i]+dp[u[i]][n]);
if(!nr) best = dp[1][n];
cout << best<<'\n';
}
int main(){
int i,x,y,c;
freopen(in);
freopen(out);
scanf("%d%d%d",&n,&m,&nr);
for(i=1;i<=nr;i++) {scanf("%d",&x);u[i]=x;}
for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&c);
G[x].push_back(make_pair(y,c));
G[y].push_back(make_pair(x,c));
}
djikstra(1);
for(i=1;i<=nr;i++) djikstra(u[i]);
solve();
return 0;
}