Cod sursa(job #1327939)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 27 ianuarie 2015 17:22:37
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
vector< vector< pair<int,int> > > a;
struct compare
 {
   bool operator()(const pair<int,int>& l, const pair<int,int>& r)
   {
       return l.first > r.first;
   }
 };
priority_queue< pair<int,int> , vector< pair<int,int> > , compare > q;
vector<int> d,pre;
vector<bool> inheap;
void dijkstra(int x)
{
    q.push({0,x});
    d[x]=pre[x]=0;
    inheap[x]=1;
    while(!q.empty())
    {
        pair<int,int> k=q.top();
        int x=k.second;
        q.pop();inheap[x]=0;
        for(auto i: a[x])
        if(d[x] + i.second < d[i.first])
        {
            d[i.first]=d[x]+i.second;
            pre[i.first]=x;
            if(!inheap[i.first])
            {
                inheap[i.first]=1;
                q.push({d[i.first],i.first});
            }
        }
    }
}
int main()
{
    int n,m,x,y,z;
    in>>n>>m;
    a=vector< vector< pair<int,int> > >(n+1);
    d=vector<int>(n+1,numeric_limits<int>::max());
    pre=vector<int>(n+1);
    inheap=vector<bool>(n+1);
    for(;m;m--)
    {
        in>>x>>y>>z;
        a[x].push_back({y,z});
    }
    dijkstra(1);
    for(int i=2;i<=n;i++)
        out<<(d[i]==numeric_limits<int>::max() ? 0 : d[i])<<' ';
    return 0;
}