Cod sursa(job #655982)

Utilizator 1994Barbulescu Daniel 1994 Data 3 ianuarie 2012 18:11:46
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define N 50005
using namespace std;

struct nod{
    int y,d;
};

vector <nod> G[N];
queue <int> C;
int n,m;
int viz[N],dist[N];

void read()
{
    int x;
    nod t;
    scanf("%d %d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&x,&t.y,&t.d);
        G[x].push_back(t);
    }
}

void init()
{
    for (int i=2;i<=n;i++)
        dist[i]=1010;
}

void dijkstra(int nod)
{
    //if (nod>n)
      //  return;
    if (dist[nod]!=1010)
    for (int i=0;i<G[nod].size();i++)
       // if (!viz[G[nod][i].y])
        {
            int a=G[nod][i].y;
            int b=G[nod][i].d;
            if (dist[a]>dist[nod]+b)
            {
                dist[a]=dist[nod]+b;
                C.push(a);
            }
            //dist[G[nod][i].y]=min(dist[G[nod][i].y],dist[nod]+G[nod][i].d);

        }
    viz[nod]=1;
    C.pop();
    if (C.empty())
        return;
    int nodd=C.front();
    dijkstra(nodd);
}

void print()
{
    for (int i=2;i<=n;i++)
        if (dist[i]!=1010)
            printf("%d ",dist[i]);
        else
            printf("0 ");
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    read();
    init();

    C.push(1);
    dijkstra(1);
    print();
    return 0;
}