Pagini recente » Cod sursa (job #568599) | Cod sursa (job #2112117) | Cod sursa (job #2852468) | Cod sursa (job #764672) | Cod sursa (job #1130122)
#include <cstdio>
#include <vector>
#include <queue>
#define nmax 2010
#define kmax 18
#define inf 1<<30
using namespace std;
struct vecin
{
int vec,c;
vecin(int vec=0, int c=0):vec(vec),c(c)
{
}
};
int k,n,m,dij,cost[nmax][nmax],a[kmax][1<<kmax],loc[kmax],ct;
vector<vecin> v[nmax];
struct cmp
{
bool operator()(const int& a, const int &b)
{
return cost[dij][a]>cost[dij][b];
}
};
priority_queue<int,vector<int>,cmp> q;
void citire()
{
int i,x,y,j,c;
scanf("%d%d%d",&n,&m,&k);
loc[1]=1;
ct=1;
for(i=1;i<=k;i++)
{
scanf("%d",&x);
loc[++ct]=x;
}
loc[++ct]=n;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
v[x].push_back(vecin(y,c));
v[y].push_back(vecin(x,c));
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cost[i][j]=inf;
for(i=1;i<=k+2;i++)
for(j=1;j<=(1<<(k+2));j++)
a[i][j]=inf;
}
void dijkstra()
{
int i,p;
vecin vc;
q.push(dij);
cost[dij][dij]=0;
while(!q.empty())
{
p=q.top();
q.pop();
for(i=0;i<v[p].size();i++)
{
vc=v[p][i];
if(cost[dij][p]+vc.c<cost[dij][vc.vec])
{
cost[dij][vc.vec]=cost[dij][p]+vc.c;
q.push(vc.vec);
}
}
}
}
int minim(int a, int b)
{
if(a<b)
return a;
return b;
}
int rez(int x, int y)
{
int i,xx;
if(a[x][y]==inf)
{
a[x][y]=inf;
for(i=1;i<=k;i++)
if(i!=x)
a[x][y]=minim(a[x][y],rez(i,y-(1<<(x-1)))+cost[loc[i]][loc[x]]);
}
return a[x][y];
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int i,x;
citire();
for(i=1;i<=ct;i++)
{
dij=loc[i];
dijkstra();
}
k+=2;
a[1][1]=0;
for(i=2;i<=k;i++)
{
x=loc[i];
a[i][(1<<(i-1))+1]=cost[1][x];
}
printf("%d",rez(k,(1<<k)-1));
return 0;
}