Cod sursa(job #2172009)

Utilizator stayraCucu Andrei stayra Data 15 martie 2018 14:35:00
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#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();
}