Pagini recente » Cod sursa (job #89538) | Cod sursa (job #671880) | Cod sursa (job #823958) | Cod sursa (job #1694018) | Cod sursa (job #2100899)
#include <fstream>
#include <iostream>
#include <set>
#include <vector>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m;
int k,C[20];
int Dist[10005];
int DistP[16][10005];
int D[1<<15+100][15];
vector <pair<int,int> > A[10005];
set <pair<int,int> > S;
inline int vb(int x, int nr)
{
return (x & (1<<nr)) != 0;
}
void Dj(int start,int Dest[])
{
for (int i=1; i<=n; i++)
Dest[i]=999999999;
Dest[start]=0;
S.clear();
for (int i=1; i<=n; i++)
S.insert(make_pair(Dest[i],i));
for (int i=1; i<=n; i++)
{
pair<int,int> cr;
cr=*S.begin();
S.erase(S.begin());
int poz=cr.second;
if (Dest[poz]>=cr.first)
{
for (vector <pair<int,int> >::iterator it=A[poz].begin(); it!=A[poz].end(); it++)
{
if (Dest[it->first]>Dest[poz]+it->second)
{
Dest[it->first]=Dest[poz]+it->second;
S.insert(make_pair(Dest[it->first],it->first));
}
}
}
}
}
int main()
{
fin>>n>>m;
fin>>k;
for (int i=0; i<k; i++)
fin>>C[i];
for (int i=1; i<=m; i++)
{
int x,y,c;
fin>>x>>y>>c;
A[x].push_back(make_pair(y,c));
A[y].push_back(make_pair(x,c));
}
Dj(1,Dist);
if (k==0)
{
fout<<Dist[n];
return 0;
}
for (int i=0; i<k; i++)
{
Dj(C[i],DistP[i]);
}
for (int i=1; i<(1<<k); i++)
{
int j=0;
for (j = 0; j < k; j++)
if (i == (1<<j))
break;
//cout<<i<<' ';
if (j < k && i == (1<<j))
{
D[i][j]=Dist[C[j]];
continue;
}
for (j=0; j<k; j++)
{
D[i][j]=999999999;
if (vb(i,j))
{
//cout<<"HYE";
for (int h = 0; h < k; h++)
{
if (h != j && vb(i, h))
{
D[i][j] = min(D[i][j], D[i-(1<<j)][h]+DistP[h][C[j]]);
}
}
}
}
}
int rez = 999999999;
for (int i = 0; i < k; i++)
{
//cout<<D[(1<<k)-1][i]<<' ';
rez = min(rez, D[(1<<k)-1][i] + DistP[i][n]);
}
fout<<rez;
return 0;
}