Pagini recente » Cod sursa (job #1233428) | Cod sursa (job #1618201) | Cod sursa (job #1675271) | Cod sursa (job #1294589) | Cod sursa (job #663996)
Cod sursa(job #663996)
#include<cstdio>
#include<climits>
#define MAX 250005
#define MAX2 50005
#define inf INT_MAX
int X[MAX],Y[MAX],C[MAX];
int D[MAX2],F[MAX2],T[MAX2];
int m,n;
void read(){
freopen("dijkstra.in","r",stdin);
scanf("%d%d",&n,&m);
int nod_pornire = 1;
/* Setez toate distantele din D cu inf */
for(int i=1;i<=n;i++)
if(i!=nod_pornire)
D[i]=inf;
/* Am trecut prin nodul de pornire (1) */
F[nod_pornire]++;
/* Read si initializez D pentru nodul de plecare (1) */
for(int i=1;i<=m;i++){
scanf("%d%d%d",&X[i],&Y[i],&C[i]);
if(X[i]==nod_pornire){
D[Y[i]]=C[i];
T[Y[i]]=nod_pornire;
}
}
fclose(stdin);
}
void min_dist(int &min,int &poz){
min=inf;
for(int i=1;i<=n;i++){
if(min>D[i] && !F[i]){
min=D[i];
poz=i;
}
}
}
void dijkstra(){
for(int i=1;i<n;i++){
/* Caut distanta minima din D si retin si pozitia acestuia si selecez nodul poz*/
int min,poz;
min_dist(min,poz);
F[poz]++;
/* Verific daca prin nodul poz nu gasesc un drum mai scurt catre celelalte noduri */
for(int j=1;j<=m;j++)
if(X[j]==poz && !F[Y[j]]) // Verific daca X este nodul de care am nevoie
if(min+C[j]<D[Y[j]]){
D[Y[j]]=min+C[j];
T[Y[j]]=poz;
}
}
}
void write(){
freopen("dijkstra.out","w",stdout);
for(int i=2;i<=n;i++){
if(D[i]==inf) printf("0 ");
else printf("%d ",D[i]);
}
fclose(stdout);
}
int main(){
read();
dijkstra();
write();
return 0;
}