Cod sursa(job #419926)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 18 martie 2010 10:39:50
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 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],Grad[Lg];
int N,M,a,Top,Dist,Top2;

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);
        Grad[a]++;
    }
}

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<Grad[Top]; i++)
        {
            Top2=Graf[Top][i].Y;
            if (Drum[ Top2 ] > Dist + Graf[Top][i].D)
            {
                Drum[ Top2 ] = Dist + Graf[Top][i].D;
                if (!viz[Top2])
                {
                    viz[Top2]=1;
                    Q.push(Top2);
                }
            }
        }
    }
}

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;
}