Pagini recente » Cod sursa (job #395534) | Cod sursa (job #1469160) | Cod sursa (job #1816191) | Cod sursa (job #2172009)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,d[20001];
bool t[20001];
const int oo=(1<<30);
struct compara{
bool operator() (int x, int y){
return d[x]>d[y];
}
};
priority_queue <int, vector<int>, compara> coada;
vector <int> a[20001];
vector <int> b[20001];
int pre[1001];
void citire()
{ int x,y,c;
f>>n>>m;
k=min(n-2,15);
for(int i=1;i<=k;i++){
f>>x;
pre[x]=1;}
for(int i=1;i<=m;i++){
f>>x>>y>>c;
a[x].push_back(y);
a[y].push_back(x);
b[x].push_back(c);
b[y].push_back(c);
}
}
void dijkstra()
{
for(int i=1;i<=n;i++)
d[i]=oo;
d[1]=0;
coada.push(1);
t[1]=true;
int nod, vecin, cost;
while(!coada.empty()){
nod=coada.top();
coada.pop();
t[nod]=false;
for(int j=0;j<a[nod].size();j++){
vecin=a[nod][j];
cost=b[nod][j];
if(d[vecin]>d[nod]+cost){
d[vecin]=d[nod]+cost;
if(!t[vecin]){
coada.push(vecin);
t[vecin]=true;
}
}
if(pre[nod]==1){
d[vecin]=d[nod]+cost;
}
}
}
}
void afisare()
{
g<<d[n];
}
int main()
{
citire();
dijkstra();
afisare();
}