Cod sursa(job #519242)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 4 ianuarie 2011 17:21:19
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <vector>
#include <utility>
#define s 1
using namespace std;
vector< pair<int,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].first]>d[u]+v[u][i].second){
                                    d[v[u][i].first]=d[u]+v[u][i].second;
                                    urca(poz[v[u][i].first]);
                                   }

    }
}
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(make_pair(y,c));
    }
    init();
    dijkstra();
    for(i=2;i<=n;i++) if (d[i]==int(2e9)) fo<<"0 "; else fo<<d[i]<<" ";
    return 0;
}