Cod sursa(job #1364945)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 27 februarie 2015 21:54:46
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>
#include <vector>
#include <set>
#include <utility>
#include <algorithm>

#define mp make_pair
#define NN 50008
#define MX 999999999;

using namespace std;

vector < pair <int,int>> a[NN];
vector < pair <int,int>>::iterator itt;

multiset <pair <int,int>> H;
multiset <pair <int,int>>::iterator it,it1;
int use[NN],d[NN],pre[NN],n,m,i,x,y,z,cost,x1,r,cr;

int main()
{
freopen("dijkstra.in", "r",stdin);
freopen("dijkstra.out", "w",stdout);

scanf("%d%d",&n,&m);
for(i=2;i<=n;i++)
d[i]=MX;

for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
a[x].push_back(mp(y,z));
}
H.insert(mp(0,1));
while (H.size()!=0){
 it=H.begin();
 cost=(*it).first;
 x1=(*it).second;
 /*for(it1=H.begin();it1!=H.end();++it1)
 printf("%d ",(*it).first);*/
 for(itt=a[x1].begin();itt!=a[x1].end();++itt){
   r=(*itt).first;
   cr=(*itt).second;
  if (cost+cr<d[r]){d[r]=cost+cr;if (use[r]==0)H.insert(mp(d[r],r));use[r]=1;pre[r]=x1;}
 }
 use[x1]=0;
H.erase(it);

}
for(i=2;i<=n;i++){
if (d[i]==999999999)d[i]=0;
printf("%d ",d[i]);
}
return 0;
}