Pagini recente » Cod sursa (job #1740128) | Cod sursa (job #2540919) | Cod sursa (job #1496589) | Cod sursa (job #910317) | Cod sursa (job #3162738)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k;
const int INF = 2000000000;
const int kmax = (1 << 17) + 3;
const int nmax = 2005;
int a[20],cost[20][20],dp[kmax][20],D[nmax],ans;
vector < int > L[nmax];
vector < int > C[nmax];
struct el
{
int nod,cost;
bool operator < (const el &A) const
{
return cost > A.cost;
}
};
priority_queue < el > q;
void read()
{
fin>>n>>m>>k;
for(int i=1;i<=k;i++) fin>>a[i];
a[0]=1;
a[++k]=n;
int x,y,z;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>z;
L[x].push_back(y);
C[x].push_back(z);
L[y].push_back(x);
C[y].push_back(z);
}
}
void dijkstra(int nod)
{
el w,w2;
w.nod=nod;
w.cost=0;
q.push(w);
while(!q.empty())
{
w2=q.top();
q.pop();
for(int i = 0;i < L[w2.nod].size();i++)
{
int nnod = L[w2.nod][i];
int ccost = C[w2.nod][i];
if(D[nnod] > D[w2.nod] + ccost)
{
D[nnod]=D[w2.nod] + ccost;
w.nod=nnod;
w.cost=D[nnod];
q.push(w);
}
}
}
}
void build()
{
for(int i=0;i<=k;i++)
{
for(int j=1;j<=n;j++) D[j]=INF;
D[a[i]]=0;
dijkstra(a[i]);
for(int j=0;j<=k;j++)
{
cost[i][j]=D[a[j]];
}
}
}
void solve()
{
int kp=(1 << k);
for(int stare=1;stare<kp;stare++)
for(int j=0;j<=k;j++)
{
dp[stare][j]=INF;
}
for(int i=0;i<=k;i++) dp[(1 << i)][i]=cost[0][i];
for(int stare=1;stare<kp;stare++)
for(int i=0;i<=k;i++)
if(stare & (1 << i))
for(int 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]);
ans=INF;
for(int i=1;i<k;i++)
{
ans=min(ans,dp[kp-1][i]+cost[i][k]);
}
fout<<ans;
}
int main()
{
read();
build();
solve();
return 0;
}