Pagini recente » Cod sursa (job #3147622) | Cod sursa (job #2558466) | Cod sursa (job #3289573) | Clasament Teme Pregatire ACM Unibuc 2014, Anul II | Cod sursa (job #3208711)
#include <fstream>
#include <queue>
#include <set>
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout("ubuntzei.out");
struct elem
{
int nod,c;
};
struct cmp
{
bool operator()(elem a,elem b){return a.c<b.c;}
};
const int INF=1e9;
int P,n,m,k,x,y,j,cost,i,V[16],dist[21][21],D[2001],sol[(1<<17)][21];
vector <elem> L[2003];
set <pair<int,int>> S;
int main()
{
fin>>n>>m;
fin>>k;
for(i=1;i<=k;i++)
fin>>V[i];
for(i=1;i<=m;i++)
{
fin>>x>>y>>cost;
L[x].push_back({y,cost});
L[y].push_back({x,cost});
}
V[0]=1;
V[k+1]=n;
for(i=0;i<=k+1;i++)
{
for(j=1;j<=n;j++)
D[j]=INF;
S.insert({0,V[i]});
D[V[i]]=0;
while(!S.empty())
{
int fr=S.begin()->second;
S.erase(S.begin());
for(auto l:L[fr])
{
if(D[l.nod]>D[fr]+l.c)
{
S.erase({D[l.nod],l.nod});
D[l.nod]=D[fr]+l.c;
S.insert({D[l.nod],l.nod});
}
}
}
for(j=0;j<=k+1;j++)
{
dist[i][j]=D[V[j]];
dist[j][i]=D[V[j]];
}
dist[i][i]=INF;
}
for(i=0;i<(1<<(k+2));i++)
for(j=0;j<=k+1;j++)
sol[i][j]=INF;
sol[0][0]=0;
dist[0][0]=0;
for(i=0;i<(1<<(k+2));i++)
for(j=0;j<k+2;j++)
if(i&(1<<j))
for(int l=0;l<k+2;l++)
sol[i][j]=min(sol[i][j],sol[i-(1<<j)][l]+dist[l][j]);
fout<<sol[(1<<(k+2))-1][k+1];
return 0;
}