Pagini recente » Cod sursa (job #732234) | Cod sursa (job #2910528) | Cod sursa (job #1558585) | Cod sursa (job #3276736) | Cod sursa (job #2572916)
#include <bits/stdc++.h>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
priority_queue < pair <int,int> , vector < pair <int,int > > , greater <pair <int,int > > > q;
int n,dist[2010][2010];
vector <pair <int,int > > v[2010];
void Dijkstra(int start_nod)
{
for(int i=1;i<=n;i++)dist[start_nod][i]=INT_MAX/2;
dist[start_nod][start_nod]=0;
q.push({0,start_nod});
while(!q.empty())
{
int nod=q.top().second;
if(dist[start_nod][nod]<q.top().first){q.pop();continue;}
else q.pop();
for(int i=0;i<v[nod].size();i++)
{
int vecin=v[nod][i].first;
int dist_intre=v[nod][i].second;
if(dist[start_nod][vecin]>dist[start_nod][nod]+dist_intre)
{
dist[start_nod][vecin]=dist[start_nod][nod]+dist_intre;
q.push({dist[start_nod][vecin],vecin});
}
}
}
}
int m,k,i,x,y,j,inter,cost,dp[2][262144][18],vecin[101][101],p[2010];
int main()
{
f>>n>>m;
f>>k;
for(i=1;i<=k;i++)f>>p[i];
for(i=1;i<=m;i++)
{
f>>x>>y>>cost;
v[x].push_back({y,cost});
v[y].push_back({x,cost});
}
p[0]=1;
k++;p[k]=n;
for(i=0;i<=k;i++)
{
Dijkstra(p[i]);
}
for(i=0;i<=k;i++)
for(j=0;j<=k;j++)
vecin[i][j]=dist[p[i]][p[j]];
k++;
for(i=1;i<(1<<k);i++)
for(j=0;j<k;j++)
dp[0][i][j]=INT_MAX/2;
dp[0][(1<<0)][0]=0;
for(i=1;i<(1<<k);i++)
{
for(j=0;j<k;j++)
{
if((i&(1<<j)))
{
for(inter=0;inter<k;inter++)
{
if(vecin[inter][j]!=INT_MAX/2 && (i&(1<<inter)))
dp[0][i][j]=min(dp[0][i][j],dp[0][i^(1<<j)][inter]+vecin[inter][j]);
}
}
}
}
g<<dp[0][(1<<k)-1][k-1];
return 0;
}