Pagini recente » Cod sursa (job #6109) | Cod sursa (job #1087994) | Cod sursa (job #1680576) | Cod sursa (job #1698684) | Cod sursa (job #3191352)
#include <fstream>
#include <set>
#include <vector>
#define INF 10000000
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector <pair <int,int> > v[2009];
vector <int> ubu;
void dijkstra(int b);
int n,m,cost[2005][2005],k,dp[17][33000],doi[20];
int main()
{
fin>>n>>m>>k;
doi[0]=1;
for(int i=1;i<=18;i++)
doi[i]=doi[i-1]*2;
for(int i=1;i<=k;i++)
{
int x;
fin>>x;
ubu.push_back(x);
}
for(int i=1;i<=m;i++)
{
int x,y,c;
fin>>x>>y>>c;
v[x].push_back({y,c});
v[y].push_back({x,c});
}
dijkstra(1);
dijkstra(n);
for(int b=0;b<ubu.size();b++)
{
dijkstra(ubu[b]);
}
for(int i=0;i<k;i++)
{
dp[i][(1<<i)]=cost[1][ubu[i]];
}
for(int mask=1;mask<doi[k];mask++)
{
for(int y=0;y<k;y++)
{
int minim=INF;
if(mask&(1<<y))
{
int mask1=mask^(1<<y);
for(int x=0;x<k;x++)
if(mask1&(1<<x))
{
minim=min(minim,dp[x][mask1]+cost[ubu[x]][ubu[y]]);
}
}
if(dp[y][mask]==0)
dp[y][mask]=minim;
}
}
int minim=INF;
for(int i=0;i<k;i++)
{
minim=min(minim,dp[i][doi[k]-1]+cost[ubu[i]][n]);
}
if(!k)
fout<<cost[1][n];
else
fout<<minim;
return 0;
}
void dijkstra(int b)
{
set <pair<int,int> > s;
s.insert({0,b});
for(int i=1;i<=n;i++)
cost[b][i]=INF;
cost[b][b]=0;
while(s.size())
{
int minim=(*s.begin()).first,x=(*s.begin()).second;
s.erase(s.begin());
for(int i=0;i<v[x].size();i++)
{
int vf=v[x][i].first,c=v[x][i].second;
if(minim+c<cost[b][vf])
{
s.erase({cost[b][vf],vf});
cost[b][vf]=minim+c;
s.insert({cost[b][vf],vf});
}
}
}
}