Pagini recente » Cod sursa (job #2147065) | Cod sursa (job #849025) | Cod sursa (job #1011133) | Cod sursa (job #590429) | Cod sursa (job #2503591)
#include <bits/stdc++.h>
#define Nmax 2005
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int n, m, k, d[Nmax], ha[15], a[16][16], x, y, c, dp[1<<15][15];
struct muchie
{
int x, c;
};
vector <muchie> v[Nmax];
struct criteriu
{
bool operator()(int x, int y)
{
if(d[x]!=d[y])
return d[x]<d[y];
return x<y;
}
};
void dijkstra(int x, int nr)
{
for(int i=1;i<=n;i++)
d[i]=INT_MAX;
d[x]=0;
set <int, criteriu> s;
for(int i=1;i<=n;i++)
s.insert(i);
while(!s.empty())
{
set <int, criteriu> :: iterator it = s.begin();
for(int i=0;i<v[*it].size();i++)
if(d[v[*it][i].x] > d[*it]+v[*it][i].c)
{
s.erase(s.find(v[*it][i].x));
d[v[*it][i].x] = d[*it]+v[*it][i].c;
s.insert(v[*it][i].x);
}
s.erase(it);
}
for(int i=0;i<k;i++)
a[nr][i]=d[ha[i]];
a[nr][k]=d[n];
}
int main()
{
fin >> n >> m >> k;
for(int i=0; i<k; i++)
fin >> ha[i];
for(int i=1; i<=m; i++)
{
fin >> x >> y >> c;
v[x].push_back({y, c});
v[y].push_back({x, c});
}
for(int i=0;i<k;i++)
dijkstra(ha[i], i);
dijkstra(1, k);
if(k==0)
{
fout << a[k][k];
return 0;
}
for(int i=0;i<k;i++)
dp[(1<<i)][i]=a[k][i];
for(int i=0;i<(1<<k);i++)
for(int j=0;j<k;j++)
if(i&(1<<j)&&(i&(i-1)))
{
m=i^(1<<j);
dp[i][j]=INT_MAX;
for(int l=0;l<k;l++)
if(m&(1<<l))
dp[i][j]=min(dp[i][j], dp[m][l]+a[j][l]);
}
int minn=INT_MAX;
for(int i=0;i<k;i++)
minn=min(minn, dp[(1<<k)-1][i]+a[i][k]);
fout << minn;
return 0;
}