Cod sursa(job #518264)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 30 decembrie 2010 22:30:37
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>
#define s 1
using namespace std;
vector<int>w[50003];
vector<int>v[50003];
int d[50001],poz[50001],heap[50001],h,n,m,u,S[50001];

void coboara(int i)
{
    int minim;
    minim=i;
    if(i*2<=h and d[heap[i]]>d[heap[i*2]]) minim=i*2;
    if(i*2+1<=h and d[heap[minim]]>d[heap[i*2+1]]) minim=i*2+1;
    if(minim!=i)
    {
        swap(poz[heap[i]],poz[heap[minim]]);
        swap(heap[i],heap[minim]);
        coboara(minim);
    }
}
void urca(int i)
{
    int key=heap[i];
    while(i>1 and d[key]<d[heap[i/2]])
    {
        heap[i]=heap[i/2];
        poz[heap[i/2]]=i;
        i=i/2;
    }
    heap[i]=key;
    poz[key]=i;
}
int extract()
{
    swap(heap[1],heap[h]);
    swap(poz[heap[1]],poz[heap[h]]);
    h--;
    coboara(1);
    return heap[h+1];
}
void init()
{
    int i;
    for(i=1;i<=n;i++)
    {
        d[i]=int(2e9);
        heap[i]=i;
        poz[heap[i]]=i;
    }
    d[s]=0;
    h=n;
}

void dijkstra()
{
    int i,x;
    while(h!=0)
    {
        u=extract();
        S[++S[0]]=u;
        x=v[u].size();
        for(i=0;i<x;i++)
        if(d[v[u][i]]>d[u]+w[u][i]){
                                    d[v[u][i]]=d[u]+w[u][i];
                                    urca(poz[v[u][i]]);
                                   }

    }
}
int main()
{
    int i,x,y,c;
    ifstream fi("dijkstra.in");
    ofstream fo("dijkstra.out");
    fi>>n>>m;
    for(i=1;i<=m;i++)
    {
        fi>>x>>y>>c;
        v[x].push_back(y);
        w[x].push_back(c);
    }
    init();
    dijkstra();
    for(i=2;i<=n;i++) if (d[i]==int(2e9)) fo<<"0 "; else fo<<d[i]<<" ";
    return 0;
}