Pagini recente » Cod sursa (job #2962793) | Cod sursa (job #1151380) | Cod sursa (job #355495) | Cod sursa (job #2382687) | Cod sursa (job #1917713)
#include <bits/stdc++.h>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,i,j,l,x,y,c,nr,sol,v[20],cost[1<<11],GR[1<<11],viz[1<<11],C[22][22],dp[16][1<<15];
vector <pair <int,int> > G[1<<11];
void djk(int ind)
{
priority_queue <pair <int,int> ,vector <pair <int,int> > ,greater <pair <int,int> > > Q;
int i,X=v[ind];
for(i=1;i<=n;++i) cost[i]=1<<30,viz[i]=0;
Q.push(make_pair(0,X));
while(!Q.empty())
{
int c=Q.top().first;
int x=Q.top().second;
Q.pop();
if(viz[x]) continue;
viz[x]=1;
cost[x]=c;
for(i=0;i<G[x].size();++i)
if(cost[G[x][i].first]>c+G[x][i].second)
{
cost[G[x][i].first]=c+G[x][i].second;
Q.push(make_pair(c+G[x][i].second,G[x][i].first));
}
}
for(i=0;i<=k;++i)
{
C[ind][i]=cost[v[i]];
if(ind==0&&i!=ind&&i!=k) dp[i][1<<(i-1)]=cost[v[i]];
}
}
int main()
{
f>>n>>m>>k;
for(i=1;i<=k;++i) f>>v[i];
for(i=1;i<(1<<k);++i)
for(j=1;j<=k;++j) dp[j][i]=1<<30;
v[0]=1;
v[++k]=n;
while(m--)
{
f>>x>>y>>c;
G[x].push_back(make_pair(y,c));
G[y].push_back(make_pair(x,c));
}
for(i=0;i<=k;++i) djk(i);
if(k==1)
{
g<<C[0][k];
return 0;
}
/// dp nod configuratie
--k;
for(l=1;l<(1<<k);++l)
{
for(i=1;i<=k;++i)
if(l&(1<<(i-1)))
{
if(dp[i][l]==(1<<30)) continue;
for(j=1;j<=k;++j)
if(!(l&(1<<(j-1))))
dp[j][l+(1<<(j-1))]=min(dp[j][l+(1<<(j-1))],dp[i][l]+C[i][j]);
}
}
--l;
sol=1<<30;
for(i=1;i<=k;++i)
sol=min(sol,dp[i][l]+C[i][k+1]);
g<<sol;
return 0;
}