Pagini recente » Cod sursa (job #491271) | Cod sursa (job #847843) | Cod sursa (job #1550895) | Cod sursa (job #2812848) | Cod sursa (job #2784429)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
int n,m;
int k;
struct amic
{
int indice;
int cost;
};
amic prieteni[15];
vector <pair<int, int >> v[10005];
struct el
{
int nod;
int cost;
int prieteni;
bool operator < (const el &A)const
{
return cost>A.cost;
}
};
int dp[255][17000];
int acum(int stare, int i)
{
int baza=0;
while(stare>0)
{
if(baza==i-1)
return stare%2;
stare=stare/2;
++baza;
}
}
priority_queue <el> Q;
void Dijkstra()
{
Q.push({1, 0, 0});
while(!Q.empty())
{
int nod=Q.top().nod;
int cost=Q.top().cost;
int prietenacum=Q.top().prieteni;
for(int x=0; x<v[nod].size(); ++x)
{
int fiu=v[nod][x].first;
int cost=v[nod][x].second;
int nrprieten=0;
for(int i=1; i<=k; ++i)
if(prieteni[i].indice==fiu)
nrprieten=i;
if(dp[nod][prietenacum]+v[nod][x].second<dp[fiu][prietenacum])
{
dp[fiu][prietenacum]=dp[nod][prietenacum]+v[nod][x].second;
Q.push({fiu, dp[fiu][prietenacum], prietenacum});
}
if(nrprieten!=0 && acum(prietenacum, nrprieten)==0 && dp[nod][prietenacum]+v[nod][x].second<dp[fiu][prietenacum+prieteni[nrprieten].cost])
{
dp[fiu][prietenacum+prieteni[nrprieten].cost]=dp[nod][prietenacum]+v[nod][x].second;
Q.push({fiu, dp[fiu][prietenacum+prieteni[nrprieten].cost], prietenacum+prieteni[nrprieten].cost});
}
}
Q.pop();
}
}
int main()
{
f>>n>>m>>k;
int total=0;
for(int i=1; i<=k; ++i)
{
f>>prieteni[i].indice;
prieteni[i].cost=pow(2, i-1);
total+=prieteni[i].cost;
}
for(int i=1; i<=m; ++i)
{
int x, y, cost;
f>>x>>y>>cost;
v[x].push_back({y, cost});
v[y].push_back({x, cost});
}
for(int i=1;i<=n;++i)
{
for(int j=0;j<=total;++j)
dp[i][j]=99999999999;
}
dp[1][0]=0;
Dijkstra();
g<<dp[n][total];
return 0;
}