Pagini recente » Cod sursa (job #1156437) | Cod sursa (job #3140064) | Cod sursa (job #2460189) | Cod sursa (job #987248) | Cod sursa (job #2145181)
#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;
}