Pagini recente » Cod sursa (job #1591555) | Cod sursa (job #2639672) | Cod sursa (job #2804819) | Cod sursa (job #2343768) | Cod sursa (job #1917623)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <bitset>
#include <queue>
#define Nmax 2001
#define Kmax 15
#define Dim 1<<15
#define Max 1000000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n, m, k, ob[Kmax], init[Nmax];
vector <pair<int, int> > gr[Nmax];
int dp[Dim][Kmax], drum[Kmax][Nmax];
void dijkstra(int x, int d[])
{
bitset <Nmax> viz;
set <pair<int, int> > q;
for(int i=1;i<=n;i++)
d[i]=Max;
d[x]=0;
q.insert(make_pair(d[x], x));
for(int i=1;i<=n;i++)
{
if(!q.empty())
{
while(!q.empty() && viz[q.begin()->second]==1)
q.erase(q.begin());
if(!q.empty())
{
int top=q.begin()->second;
q.erase(q.begin());
for(auto j:gr[top])
{
if(viz[j.first]==0 && d[j.first]>d[top]+j.second)
{
d[j.first]=d[top]+j.second;
q.insert(make_pair(d[j.first], j.first));
}
}
viz[top]=1;
}
}
}
}
int main()
{
int i,j,l;
f>>n>>m;
f>>k;
for(i=0;i<k;i++)
f>>ob[i];
for(i=1;i<=m;i++)
{
int x,y,c;
f>>x>>y>>c;
gr[x].push_back(make_pair(y,c));
gr[y].push_back(make_pair(x,c));
}
dijkstra(1, init);
if(k==0)
{
g<<init[n];
return 0;
}
for(i=0;i<k;i++)
{
dijkstra(ob[i], drum[i]);
dp[1<<i][i]=init[ob[i]];
}
for(i=0;i<(1<<k);i++)
for(j=0;j<k;j++)
dp[i][j]=Max;
for(i=1;i<(1<<k);i++)
{
for(j=0;j<k;j++)
if(i==(1<<j))
break;
if(j<k && i==(1<<j))
{
dp[i][j]=init[ob[j]];
continue;
}
for(j=0;j<k;j++)
{
if((i&(1<<j))!=0)
{
for(l=0;l<k;l++)
{
if(l!=j && (i&(1<<l))!=0)
{
dp[i][j]=min(dp[i][j], dp[i^(1<<j)][l]+drum[l][ob[j]]);
}
}
}
}
}
int sol=Max;
for(i=0;i<k;i++)
{
sol=min(sol, dp[(1<<k)-1][i]+drum[i][n]);
}
g<<sol;
return 0;
}