Pagini recente » Cod sursa (job #1982419) | Cod sursa (job #1032517) | Cod sursa (job #2727968) | Cod sursa (job #2016219) | Cod sursa (job #1113684)
#include <fstream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#define INF 1<<30
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,d[15],a[20][2001],viz[2001],dp[1<<15][20],x,y,c;
vector <pair<int,int> > v[2001];
queue <int> q;
void init(){
for(int i=0;i<=k;i++)
for(int j=1;j<=n;j++)
a[i][j]=INF;
for(int i=0;i<=((1<<k)-1);i++)
for(int j=0;j<k;j++)
dp[i][j]=INF;
}
void bellmanford(int x){
memset(viz,0,sizeof(viz));
a[x][d[x]]=0;
q.push(d[x]);viz[d[x]]=1;
while(!q.empty()){
int nod=q.front();viz[nod]=0;q.pop();
for(int i=0;i<v[nod].size();i++)
{ int nd=v[nod][i].first;
int ct=v[nod][i].second;
if(a[x][nd]>a[x][nod]+ct){
a[x][nd]=a[x][nod]+ct;
if(viz[nd]==0){
q.push(nd);
viz[nd]=1;
}
}
}
}
}
int main()
{
f>>n>>m>>k;
for(int i=0;i<k;i++)
f>>d[i];
d[k]=1;
for(int i=1;i<=m;i++){
f>>x>>y>>c;
v[x].push_back(make_pair(y,c));
v[y].push_back(make_pair(x,c));
}
init();
for(int i=0;i<=k;i++)
bellmanford(i);
if(k==0){
g<<a[k][n];
return 0;
}
for(int i=0;i<k;i++)
dp[1<<i][i]=a[k][d[i]];
for(int i=1;i<=((1<<k)-1);i++) {
for(int j=0;j<k;j++)
if((i&(1<<j))!=0){
if((i^(1<<j))==0)
continue;
for(int t=0;t<k;t++)
if(t!=j&&(i&(1<<t))!=0)
if(dp[i^(1<<j)][t]!=INF&&dp[i][j]>dp[i^(1<<j)][t]+a[t][d[j]])
dp[i][j]=dp[i^(1<<j)][t]+a[t][d[j]];
}
}
int Min=INF;
for(int i=0;i<k;i++)
if(dp[(1<<k)-1][i]+a[i][n]<Min)
Min=dp[(1<<k)-1][i]+a[i][n];
g<<Min;
return 0;
}