Pagini recente » Cod sursa (job #2110900) | Cod sursa (job #2309850) | Cod sursa (job #1885283) | Cod sursa (job #1144509) | Cod sursa (job #1127829)
#include <cstdio>
#include <vector>
#include <queue>
#define nmax 2010
#define kmax 20
#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;
}
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]==0)
{
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))+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;
for(i=1;i<=k;i++)
{
//x=loc[i];
a[i][(1<<x)+1]=cost[loc[1]][loc[i]];
}
printf("%d",rez(k-1,(1<<(k))-1));
return 0;
}