Pagini recente » Cod sursa (job #2463922) | Autentificare | Cod sursa (job #2708177) | Borderou de evaluare (job #996835) | Cod sursa (job #2972383)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,k,p1[2001],d[2001],z[2001],w[2001],y[2001][2001],k1,mini=2000000000;
int dp[1<<17][17];
bool p[2001];
vector<pair<int, int> > x[4001];
struct C{
bool operator()(int a, int b)
{
return d[a]>d[b];
}
};
priority_queue<int, vector<int>, C> q;
void Dijkstra(int a)
{q.push(a);
p[a]=1;
d[a]=0;
while(q.empty()!=1)
{a=q.top();
p[a]=0;
for(size_t i=0;i<x[a].size();i++)
{int v=x[a][i].first, c=x[a][i].second;
if(d[v]>d[a]+c)
{d[v]=d[a]+c;
if(p[v]==0)
{p[v]=1;
q.push(v);
}
}
}
q.pop();
}
}
void D(int a, int k, int s)
{if(k==k1 && a==k)
{
if(s<mini)mini=s;
}
else if(k!=k1)
{for(int i=1;i<=k1;i++)
if(y[a][i]!=0)
{int m=y[a][i];
y[a][i]=y[i][a]=0;
D(i, k+1, s+m);
y[a][i]=y[i][a]=m;
}
}
}
int main()
{ int m,a,b,c;
fin>>n>>m>>k;
z[1]=1;
for(int i=2;i<=k+1;i++)
{fin>>a;
z[i]=a;
}
for(int i=1;i<=m;i++)
{fin>>a>>b>>c;
x[a].push_back(make_pair(b, c));
x[b].push_back(make_pair(a, c));
}
k+=2;
z[k]=n;
for(int i=1;i<=k;i++)
{for(int j=1;j<=n;j++)
d[j]=2000000000;
Dijkstra(z[i]);
for(int j=1;j<i;j++)
if(p1[z[j]]==1)
y[i][j]=y[j][i]=d[z[j]];
for(int j=1;j<=n;j++)
d[j]=p[j]=0;
p1[z[i]]=1;
}
k1=k;
for(int i=0;i<k1;i++)
for(int j=0;j<k1;j++)
y[i][j]=y[i+1][j+1];
for(int i=0;i<k1;i++)
for(int j=0;j<1<<17;j++)
dp[j][i]=10000000;
dp[1][0]=0;
for(int mask=3;mask<1<<k1;mask+=2)
for(int i=1;i<k;i++)
if(mask & (1<<i))
for(int j=0;j<k;j++)
if(y[i][j])dp[mask][i]=min(dp[mask][i], dp[mask ^ 1<<i][j]+y[i][j]);
fout<<dp[(1<<k)-1][k-1];
return 0;
}