Cod sursa(job #796533)

Utilizator lucian666Vasilut Lucian lucian666 Data 11 octombrie 2012 19:02:33
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb


//Vasilut
//Dijkstra cu priority_queue

#include<fstream>
#include<algorithm>
#include<vector>
#include<queue>
#include<utility>


#define pb push_back
#define INF 0x3f3f3f3f
#define mp make_pair
#define NN 50001
#define f first
#define s second


using namespace std;
ofstream out("dijkstra.out");

int n,m;
vector<pair<int,int > > G[NN];
vector<int>dist;


struct comp{
    bool operator() (int i,int j)
    {
        return dist[i] < dist[j];
    }
};

priority_queue<int,vector<int>,comp>Q;

void read();
void Dijkstra();
void write();

int main()
{
    read();
    Dijkstra();
    write();
    return 0;
}

void read()
{
    ifstream in("dijkstra.in");
    in>>n>>m;
    for(int x,y,c; m ;--m)
    {
        in>>x>>y>>c;
        G[x].pb(mp(y,c));
    }
}

void write()
{
        for(int i=2;i<=n;i++)
            if(dist[i] == INF )
                out<<0<<" ";
                else
                out<<dist[i]<<" ";
}


void Dijkstra()
{
    dist.assign(n+1,INF);
    dist[1]=0;
    Q.push(1);
    int k;
    while(!Q.empty())
        {
            k=Q.top();
            Q.pop();
                for( int i=0; (int ) i<G[k].size(); ++i)
                    if(dist[G[k][i].f] > dist[k] + G[k][i].s )
                    {
                        dist[G[k][i].f]=dist[k] + G[k][i].s;
                        Q.push(G[k][i].f);
                    }
        }
}