Pagini recente » Cod sursa (job #2764461) | Cod sursa (job #1530625) | Cod sursa (job #2073195) | Cod sursa (job #497731) | Cod sursa (job #2706819)
#include <bits/stdc++.h>
#define NMAX 2002
#define KMAX 15
#define INF 1e9
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
struct ura
{
int c,x;
}v;
struct stare
{
int nod,lung,config;
}u;
int n,m,k,sm;
int ruta[NMAX];
vector<ura>adj[NMAX];
int dp[NMAX][(1 << KMAX) +1];
int cv(int nod)
{
if(ruta[nod])
return (1 << (ruta[nod]-1));
else
return 0;
}
bool operator < (stare a, stare b)
{
if(a.lung==b.lung)
return (a.config > b.config);
else
return (a.lung > b.lung);
}
void initializare()
{
for(int i=1;i<=n;i++)
for(int j=0;j<= (1 << k);j++)
dp[i][j]=INF;
}
void dijkstra()
{
priority_queue <stare> pq;
initializare();
dp[1][0]=0;
pq.push({1,0,cv(1)});
while(!pq.empty() && pq.top().lung<dp[n][(1<<k)-1])
{
u=pq.top();
pq.pop();
for(vector<ura>::iterator it=adj[u.nod].begin();it!=adj[u.nod].end();it++)
{
v=*it;
int config_curenta;
if(u.config & cv(v.x))
config_curenta=u.config;
else
config_curenta=u.config+cv(v.x);
if(dp[v.x][config_curenta]>dp[u.nod][u.config]+v.c)
{
dp[v.x][config_curenta]=dp[u.nod][u.config]+v.c;
pq.push({v.x,dp[v.x][config_curenta],config_curenta});
}
}
}
out<<dp[n][(1<<k)-1];
}
int main()
{
in>>n>>m>>k;
for(int i=1;i<=k;i++){
int nr;
in>>nr;
ruta[nr]=i;
}
for(int i=1;i<=m;i++)
{
int a,b,cost;
in>>a>>b>>cost;
sm+=cost;
adj[a].push_back({cost,b});
adj[b].push_back({cost,a});
}
dijkstra();
return 0;
}