Cod sursa(job #2856620)

Utilizator razvanalexrotaruRazvan Alexandru Rotaru razvanalexrotaru Data 24 februarie 2022 10:20:41
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.54 kb
/*#include<bits/stdc++.h>
#define cin fin
#define cout fout
#define Nmax 50008
#define oo 1<<30
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");
int n,p;
int v[Nmax],cnt[Nmax];
vector<pair <int,int> >G[Nmax];
struct compara
{
    bool operator()(int y,int x)
    {
        return v[x]>v[y];
    }
};
priority_queue<int,vector<int>,compara> Coada;
void Citeste()
{
    int x,y,c;
    cin>>n>>p;
    while(fin>>x>>y>>c)
        G[x].push_back(make_pair(y,c));
}
void Dijkstra(int nodStart)
{
    for(int i=1;i<=n;i++)
        v[i]=oo;
    v[nodStart]=0;
    Coada.push(nodStart);
    while(!Coada.empty())
    {
        int k=Coada.top();
        Coada.pop();
        for(auto i:G[k])
            if(v[k]+i.second<v[i.first])
            {
                v[i.first]=v[k]+i.second;
                Coada.push(i.first);
                cnt[i.first]=1;
            }
            else
            if(v[k]+i.second==v[i.first])
            {
                cnt[i.first]++;
            }
    }
}
void Afiseaza()
{
    for(int i=1;i<=n;i++)
    {
        if(v[i]!=oo)
            cout<<cnt[i]<<" ";
        else
            cout<<"-1 ";
    }
}
int main()
{
    Citeste();
    Dijkstra(p);
    Afiseaza();
}
*/
#include<bits/stdc++.h>
#define cin fin
#define cout fout
#define Nmax 50008
#define oo 1<<30
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");
int n,p;
int v[Nmax],viz[Nmax];
vector<pair <int,int> >G[Nmax];
struct compara
{
    bool operator()(int y,int x)
    {
        return v[x]>v[y];
    }
};
priority_queue<int,vector<int>,compara> Coada;
void Citeste()
{
    int x,y,c;
    cin>>n>>p;
    while(fin>>x>>y>>c)
        G[x].push_back(make_pair(y,c));
}
void Dijkstra(int nodStart)
{
    for(int i=1;i<=n;i++)
        v[i]=oo;
    v[nodStart]=0;
    viz[nodStart]=1;
    Coada.push(nodStart);
    while(!Coada.empty())
    {
        int k=Coada.top();
        Coada.pop();
        viz[k]=0;
        for(auto i:G[k])
            if(v[k]+i.second<v[i.first])
            {
                v[i.first]=v[k]+i.second;
                if(viz[i.first]==0)
                {
                    viz[i.first]=1;
                    Coada.push(i.first);
                }
            }
    }
}
void Afiseaza()
{
    for(int i=2;i<=n;i++)
    {
        if(v[i]!=oo)
            cout<<v[i]<<" ";
        else
            cout<<"0 ";
    }
}
int main()
{
    Citeste();
    Dijkstra(1);
    Afiseaza();
}