Cod sursa(job #419924)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 18 martie 2010 10:37:56
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define IN "dijkstra.in"
#define OUT "dijkstra.out"
#define Lg 50010
#define INF 0x3f3f3f

using namespace std;

struct pct
{
    int D,Y;
}p;

vector <pct> Graf[Lg];
int viz[Lg],Drum[Lg];
int N,M,a,Top,Dist;

struct cmp
{
    bool operator()(const int &a,const int &b)const
    {
        return Drum[a]>Drum[b];
    }
};
priority_queue< int , vector<int> , cmp> Q;

void Read()
{
    scanf ("%d %d",&N,&M);

    for (int i=0;i<M;i++)
    {
        scanf ("%d %d %d",&a,&p.Y,&p.D);
        Graf[a].push_back(p);
    }
}

void Solve()
{
    for (int i=1;i<=N;i++)
        Drum[i]=INF;

    Q.push(1);
    viz[1]=1;
    Drum[1]=0;
    while (!Q.empty())
    {
        Top=Q.top();
        Q.pop();
        viz[Top]=0;
        Dist=Drum[Top];
        for (int i=0 ; i<Graf[Top].size(); i++)
            if (Drum[ Graf[Top][i].Y ] > Dist + Graf[Top][i].D)
            {
                Drum[ Graf[Top][i].Y ] = Dist + Graf[Top][i].D;
                if (!viz[Graf[Top][i].Y])
                {
                    viz[Graf[Top][i].Y]=1;
                    Q.push(Graf[Top][i].Y);
                }
            }
    }
}

void Write()
{
    for (int i=2;i<=N;i++)
        printf("%d " , Drum[i]==INF?0:Drum[i]);
    printf("\n");
}

int main ()
{
    freopen (IN , "r",stdin);
    freopen (OUT ,"w",stdout);
    Read();
    Solve();
    Write();
    return 0;
}