Cod sursa(job #1105434)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 11 februarie 2014 20:03:55
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <functional>

using namespace std;

#define inf 9999999
#define dmax 50001
#define pb push_back
#define x first
#define y second

typedef pair<int, int> pi;
vector <pi> v[dmax];
int d[dmax], pre[dmax], n, m;
priority_queue <pi, vector <pi>, less <pi> > q;
bool use[dmax];

void read()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    int a, b, c;

    scanf("%i %i ",&n, &m);
    for(int i=1; i<=m; i++)
    {
        scanf("%i %i %i", &a, &b, &c);
    v[a].pb(make_pair(c, b));
    }

}

void dijkstra(int x)
{
    for(int i=1; i<=n; i++)
    {
        pre[i]=x;
        d[i]=inf;
    }

    q.push(make_pair(d[x], x));
    d[1]=0;

    while(!q.empty())
    {
        pi a=q.top();
        use[a.y]=1;
        q.pop();
        for(int i=0; i<v[a.y].size(); i++)
        {

            //if(!use[v[a.y][i].y])
            //{
            int h=v[a.y][i].y;
            if(d[h]>v[a.y][i].x+d[a.y])
            {
                d[h]=v[a.y][i].x+d[a.y];
                q.push(v[a.y][i]);
            }


            //actualizez lista de min

            for(int j=0;j<v[h].size();j++)
            {
                //if(!use[v[h][j].y])

                pi w=v[h][j];
                if(d[w.y]>d[h]+w.x)
                {
                    q.push(w);
                    d[w.y]=d[h]+w.x;
                }

            }

            }


    }



}

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


int main()
{
    read();

    dijkstra(1);
    printd();
    return 0;
}