Cod sursa(job #549094)

Utilizator anaa_mariaaana dima anaa_mariaa Data 8 martie 2011 09:57:49
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream.h>
#include<limits.h>
#define NM 1001
#define INF (INT_MAX-10)/2
int c[NM][NM],d[NM],S[NM],prec[NM],n,start=1,m,j;

ifstream in("dijkstra.in");
ofstream out("dijkstra.out");

void build(){
int i,x,y,cost;
in>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
 c[i][j]=INF;
for(i=1;i<=n;i++)
c[i][i]=0;
for(i=1;i<=m;i++){
in>>x>>y>>cost;
c[x][y]=cost;}//in>>start;
}

void init(){
int i;
S[start]=1;
for(i=1;i<=n;i++)
d[i]=c[start][i];}

int minim(){
int m=INF*2,i,k;
for(i=1;i<=n;i++)
  if(!S[i]&&d[i]<m){
  m=d[i];
  k=i;}
  return k;}

void dijkstra(){
int k,i,dc,nrs=1,gata=0;
do{ k=minim();
if(d[k]==INF||nrs==n)
gata=1;
else { S[k]=1;
nrs++;
for(i=1;i<=n;i++)
  if(!S[i]){
  dc=d[k]+c[k][i];
  if(dc<d[i]){
  d[i]=dc;
  prec[i]=k;}}
  }
  }
  while(!gata);}

void drum(int x){
if(x){

drum(prec[x]);
out<<x<<" ";}}

int main(){
int i;
build();
init();
dijkstra();
for(i=2;i<=n;i++)
if(d[i]<INF)
out<<d[i]<<" ";
else
out<<0<<" ";
return 0;}