Pagini recente » Cod sursa (job #2605480) | Cod sursa (job #1375773) | Cod sursa (job #1194194) | Cod sursa (job #801573) | Cod sursa (job #2560290)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k,x,y,c[17],cost,d[17][2005],dp[131080][20];
vector<pair<int,int>> v[2005];
priority_queue< pair<int,int> , vector<pair<int,int>> ,greater<pair<int,int>>> q;
pair<int,int> z;
void dijkstra(int nod,int d[])
{
for(int i=1;i<=n;i++)
d[i]=1e9;
q.push({0,nod});
d[nod]=0;
while(!q.empty())
{
z=q.top();
q.pop();
for(auto it:v[z.second])
{
if(d[it.second]>d[z.second]+it.first)
{
d[it.second]=d[z.second]+it.first;
q.push({d[it.second],it.second});
}
}
}
}
int main()
{
in>>n>>m;
in>>k;
for(int i=1;i<=k;i++)
in>>c[i];
for(int i=1;i<=m;i++)
{
in>>x>>y>>cost;
v[x].push_back({cost,y});
v[y].push_back({cost,x});
}
c[0]=1;
c[++k]=n;
for(int i=0;i<=k;i++)
dijkstra(c[i],d[i]);
for(int i=1;i<=((1<<(k+1))-1);i++)
for(int j=0;j<=k;j++)
dp[i][j]=1e9;
dp[1][0]=0;
for(int i=2;i<=((1<<(k+1))-1);i++)
{
for(int j=0;j<=k;j++)
{
if((1<<j)&i)
{
for(int q=0;q<=k;q++)
if(((1<<q)&i)&&q!=j)
dp[i][j]=min(dp[i][j],dp[i^(1<<j)][q]+d[q][c[j]]);
}
}
}
//(int i=0;i<=k;i++) cout<<d[n][i]<<" ";
out<<dp[(1<<(k+1))-1][k];
return 0;
}