Cod sursa(job #1747729)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 25 august 2016 15:14:04
Problema Algoritmul lui Dijkstra Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

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

int heap[500010],nc,poz[500010];

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

void elim()
{
    heap[1]=heap[nc--];
    poz[1]=poz[nc+1];
    heap[nc+1]=50000001;
    int i=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]=50000001;
    heap[++nc]=0;
    poz[1]=1;
    while (nc)
    {
        int x=poz[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");
}