Cod sursa(job #1923366)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 10 martie 2017 23:05:26
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <bits/stdc++.h>
#define weight first
#define node second
#define mp make_pair
#define INF 1e8
#define buffs 1048576
using namespace std;

vector < pair <int,int> > Q;
vector < pair <int,int> > G[50001];
pair <int,int> u;
char buff[buffs];
int  viz[50001]={0};
int n, m,pos=0;
int d[50001];
FILE *f=freopen("dijkstra.in","r",stdin);

inline void read(int &x)
{
    while( buff[pos]<'0'||buff[pos]>'9') if(++pos==buffs) fread(buff,1,buffs,stdin),pos=0;
    x=0;
    while( buff[pos]>='0'&&buff[pos]<='9')
    {
        x=(x<<1)+(x<<3)+buff[pos]-'0';
        if(++pos==buffs) fread(buff,1,buffs,stdin),pos=0;
    }
}

struct cmp
{
    bool operator()(const pair<int, int>& a, const pair<int, int>& b)
        {
            return a.weight > b.weight;
        }
};

void init()
{   d[1]=0;
    viz[1]=1;
    for(int i=2;i<=n;i++) d[i]=INF;
}

void read_data()
{
    int x,y,c;
    fread(buff,1,buffs,stdin);
    read(n);read(m);
    for(int i=1;i<=m;i++)
    {
        read(x);read(y);read(c);
        G[x].push_back( mp(c,y) );
    }
}

void dijkstra()
{
    for(auto it:G[1]) Q.push_back(it),push_heap(Q.begin(), Q.end(),cmp()),d[it.node] = it.weight;

     while(!Q.empty())
    {
        u=Q[0];
        pop_heap(Q.begin(),Q.end(),cmp());
        Q.pop_back();
        if(viz[u.node] == 0)
            {
                viz[u.node]=1;
                for(auto v :G[u.node])
                {
                    if(viz[v.node]==0 && d[v.node]>d[u.node]+v.weight)
                    {
                        d[v.node]=d[u.node]+v.weight;
                        Q.push_back(mp( d[v.node] , v.node));
                        push_heap(Q.begin(),Q.end(),cmp());
                    }
                }

            }

    }
}

void write_result()
{
    freopen("dijkstra.out", "w", stdout);
    for(int i=2;i<=n;i++)
        if(d[i]==INF) cout<<"0 ";
        else cout<<d[i]<<' ';

}
int main()
{

    read_data();
    init();
    dijkstra();
    write_result();
}