Pagini recente » Cod sursa (job #377363) | Cod sursa (job #1403316) | Cod sursa (job #2542834) | Cod sursa (job #2841062) | Cod sursa (job #2590427)
//#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int Max=2005;
int n,m,k; bool imp[Max],incoada[Max][16];
vector < pair <int ,int > >v[Max];
int dist[Max][16];
struct coada
{
int nod,nrk;
};
struct compara
{
bool operator()(coada q1,coada q2)
{
return dist[q1.nod][q1.nrk]>dist[q2.nod][q2.nrk];
}
};
priority_queue < coada,vector <coada>,compara >pq;
void citire()
{
in>>n>>m;
in>>k;
for(int i=1;i<=k;i++)
{
int x; in>>x;
imp[x]=1;
}
for(int i=1;i<=m;i++)
{
int x,y,z;;
in>>x>>y>>z;
v[x].push_back({y,z});
v[y].push_back({x,z});
}
}
void Dijkstra()
{
for(int i=2;i<=n;i++)
for(int j=0;j<=k;j++)
dist[i][j]=(1<<31)-1;
pq.push({1,0});
while(!pq.empty())
{
int nod=pq.top().nod; int nrt=pq.top().nrk; pq.pop(); incoada[nod][nrt]=0;
for(int j=0;j<v[nod].size();j++)
{
int vec=v[nod][j].first;
int cost=v[nod][j].second;
int nrp=nrt+imp[vec];
if(dist[vec][nrp]>dist[nod][nrt]+cost)
{
dist[vec][nrp]=dist[nod][nrt]+cost;
if(!incoada[vec][nrp])
{
incoada[vec][nrp]=1;
pq.push({vec,nrp});
}
}
}
}
}
int main()
{
citire();
Dijkstra();
out<<dist[n][k];
return 0;
}