Cod sursa(job #407536)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 2 martie 2010 13:41:59
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <queue>
#define size 50010

using namespace std;

struct nod
{
    int inf,c;
    nod *next;
}*a[size];


int n,m,dist[size],viz[size];

struct cmp
{
    bool operator()(const int &a,const int &b)const
    {
        return dist[a]>dist[b];
    }
};

priority_queue <int,cmp> Q;

void add(nod *&a,int i,int dist)
{
    nod *q=new nod;
    q->inf=i;
    q->c=dist;
    q->next=a;
    a=q;
}


void citire()
{
    int A,B,C;
    scanf ("%d %d",&n,&m);
    for (int i=0;i<m;i++)
    {
        scanf ("%d %d %d",&A,&B,&C);
        add(a[A],B,C);
        //add(a[B],A,C);
    }
}


void solve()
{
    int n;
    memset(dist,0x3f3f,sizeof(dist));
    Q.push(1);
    dist[1]=0;
    while (!Q.empty())
    {
        n=Q.top();
        Q.pop();
        viz[n]=0;
        for (nod *i=a[n] ; i ;i=i->next)
            if (dist[i->inf] > i->c + dist[n])
            {
                dist[i->inf] = i->c + dist[n];
                if (!viz[i->inf])
                {
                    viz[i->inf]=1;
                    Q.push(i->inf);
                }
            }
    }
}

void afish()
{
    for (int i=2;i<=n;i++)
        printf("%d ",dist[i]==0x3f3f?0:dist[i   ]);
    printf("\n");
}

int main ()
{
    freopen ("dijkstra.in","r",stdin);
    freopen ("dijkstra.out","w",stdout);
    citire();
    solve();
    afish();
    return 0;
}