Cod sursa(job #2145181)

Utilizator mihaicivMihai Vlad mihaiciv Data 27 februarie 2018 10:23:37
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 100001
#define inf 1000001
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
vector <int> a[nmax],c[nmax];
int d[nmax],m,n,p;
int Pozitia,Valoare;
bool vis[nmax],Vizitat;
struct arbore {
    int val,pos;
    bool viz;
}arb[3*nmax];
void citire() {
    f>>n>>m;
    int x,y,z;
    for (int i=1;i<=m;i++) {
        f>>x>>y>>z;
        a[x].push_back(y);
        a[y].push_back(x);
        c[x].push_back(z);
        c[y].push_back(z);
    }
}
void Adauga(int nod,int st,int dr) {
    if (st==dr) {
        arb[nod].val=Valoare;
        arb[nod].viz=Vizitat;
        arb[nod].pos=Pozitia;
    }
    else {
        int mij=(st+dr)/2;
        if (mij>=Pozitia) {
            Adauga(2*nod,st,mij);
        }
        else {
            Adauga(2*nod+1,mij+1,dr);
        }
        if (arb[2*nod].viz==1) {
            arb[nod]=arb[2*nod+1];
        }
        else if (arb[2*nod+1].viz==1) {
            arb[nod]=arb[2*nod];
        }
        else {
            if (arb[2*nod].val<=arb[2*nod+1].val) {
                arb[nod]=arb[2*nod];
            }
            else {
                arb[nod]=arb[2*nod+1];
            }
        }
    }
}
void rez() {
    p=1;
    for (int i=1;i<=n;i++) {
        d[i]=inf;
    }
    for (int i=0;i<a[p].size();i++) {
        int p1=a[p][i];
        d[p1]=c[p][i];
    }
    d[p]=0;
    vis[p]=1;
    for (int i=1;i<=n;i++) {
        Valoare=d[i];
        Vizitat=vis[i];
        Pozitia=i;
        Adauga(1,1,n);
    }
    int Pozitia2=0;
    for (int i=1;i<n;i++) {
        vis[arb[1].pos]=1;
        Vizitat=1;
        Pozitia=arb[1].pos;
        Valoare=arb[1].val;
        Adauga(1,1,n);
        Pozitia2=Pozitia;
        for (int j=0;j<a[Pozitia2].size();j++) {
            int p1=a[Pozitia2][j];
            if (vis[p1]==0 && d[Pozitia2]+c[Pozitia2][j]<d[p1]  ) {
                //cout<<p1<<" "<<Pozitia2<<"\n";
                d[p1]=d[Pozitia2]+c[Pozitia2][j];
                Pozitia=p1;
                Vizitat=0;
                Valoare=d[Pozitia2]+c[Pozitia2][j];
                Adauga(1,1,n);
            }
        }
    }

    for (int i=2;i<=n;i++) {
        if (d[i]!=inf) {
            g<<d[i]<<" ";
        }
        else {
            g<<0<<" ";
        }
    }

}
int main() {
    citire();
    rez();
    return 0;
}