Cod sursa(job #1747495)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 24 august 2016 23:39:23
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

int n,m,i,j;
int costminim[50010];

int heap[50010],nc;

void ins(int x)
{
    heap[++nc]=x;
    int i=nc;
    while (i>1&&costminim[heap[i/2]]>costminim[x])
        swap(heap[i],heap[i/2]),i/=2;
}

void elim()
{
    heap[1]=heap[nc--];
    heap[nc+1]=50000002;
    int i=1;
    bool ok=1;
    while ((2*i<=nc)&&(costminim[heap[2*i]]<costminim[heap[i]]||costminim[heap[2*i+1]]<costminim[heap[i]]))
    {
        if (costminim[heap[2*i]]<costminim[heap[2*i+1]])
            swap(heap[i],heap[2*i]),i=i*2;
        else if (2*i+1>nc) break;
        else swap(heap[i],heap[2*i+1]),i=i*2+1;
    }
}

vector <int> v[50010],cost[50010];

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1; i<=m; i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        v[a].push_back(b);
        cost[a].push_back(c);
    }
    for (i=2; i<=n; i++)
        costminim[i]=50000001,heap[i]=50000002;
    heap[++nc]=1;
    while (nc)
    {
        int x=heap[1];
        elim();
        for (i=0; i<v[x].size(); i++)
            if (costminim[x]+cost[x][i]<costminim[v[x][i]])
            {
                costminim[v[x][i]]=cost[x][i]+costminim[x];
                ins(v[x][i]);
            }

    }
    for (i=2; i<=n; i++)
        if (costminim[i]!=50000001)
            printf("%d ",costminim[i]);
        else printf("0 ");
    printf("\n");
}