Pagini recente » Cod sursa (job #1816588) | Cod sursa (job #761417) | Cod sursa (job #1434102) | Cod sursa (job #2124160) | Cod sursa (job #2654943)
#include <bits/stdc++.h>
#define kmax 33000
#define INF 2000000000
using namespace std;
ifstream ci("ubuntzei.in");
ofstream cou("ubuntzei.out");
struct date{
int nod,cost;
};
int n,m,k;
int spec[30],cost[30][30];
vector<date>v[2005];
int dis[2005];
int dp[kmax][30]; //dis min pana la nodu j trecand prin nodurile descrise de stare
queue<int>q;
void citire(){
ci>>n>>m>>k;
for(int i=0;i<k;i++){
ci>>spec[i];
}
int a,b,c;
date p;
for(int i=1;i<=m;i++){
ci>>a>>b>>c;
p.cost=c;
p.nod=b;
v[a].push_back(p);
p.nod=a;
v[b].push_back(p);
}
}
void Djakstra(int nod){
int w,w1,c,y;
w=nod;
q.push(w);
while(!q.empty()){
w=q.front();
q.pop();
for(auto i:v[w]){
y=i.nod;
c=i.cost;
if(dis[y]>dis[w]+c){
dis[y]=dis[w]+c;
q.push(y);
}
}
}
}
void InitD(){
int i,nod,stare;
for(stare=0;stare<(1<<k);stare++){
for(i=0;i<k;i++){
dp[stare][i]=INF;
}
}
for(i=1;i<=n;i++){
dis[i]=INF;
}
dis[1]=0;
InitD(1);
for(i=0;i<=k-1;i++){
dp[1<<i][i]=dis[spec[i]];
}
}
void rez(){
int i,j,stare,nod;
int mx;
mx=(1<<k);
InitD();
for(i=0;i<k;i++){
nod=spec[i];
for(j=1;j<=n;j++){
dij[j]=INF;
}
dij[nod]=0;
Djakstra(nod);
for(j=0;j<k;j++){
cost[i][j]=dij[a[j]];
}
}
for(stare=0;stare<=smax;stare++){
for(i=0;i<k;i++){
if((stare&(1<<i))){
for(j=0;j<k;j++){
if(!(stare&(1<<j))){
dp[stare|(1<<j)][j]=min(dp[stare|(1<<j)][j],dp[stare][i]+cost[i][j]);
}
}
}
}
}
for(i=1;i<=n;i++){
dis[i]=INF;
}
dis[n]=0;
Djakstra(n);
int sol=INF;
for(i=0;i<k;i++){
sol=min(sol,dp[mx-1][i]+dis[spec[i]]);
}
if(k==0){
sol=dis[1];
}
cou<<sol;
}
int main()
{
citire();
rez();
return 0;
}