Cod sursa(job #1195206)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 6 iunie 2014 17:46:03
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#define infinite 1<<30
using namespace std;
FILE *f=fopen("dijkstra.in","r");
FILE *g=fopen("dijkstra.out","w");
int n,m,viz[50001],d[50001],t[50001],x[3][250001],nr,st[50001];



inline void creeaza(int a,int b,int cost)
{nr++;
x[0][nr]=b;
x[2][nr]=cost;
x[1][nr]=st[a];
st[a]=nr;
}
inline int minim()
{int i,mini=infinite,k;
for (i=1;i<=n;i++)
            if (!viz[i]&&d[i]<mini) mini=d[i],k=i;
return k;
}
inline void dijsktra()
{int i,j,k;

for (i=1;i<=n;i++)
            {k=minim();
              viz[k]=1;
              j=st[k];
              while (j!=0) {if (d[k]+x[2][j]<d[x[0][j]]) {d[x[0][j]]=d[k]+x[2][j];
                                                                               t[x[0][j]]=k;}
                                   j=x[1][j];
                                  }
              }
}
int main()
{int i,x,y,cost;
fscanf(f,"%d %d",&n,&m);
for (i=1;i<=m;i++)  {fscanf(f,"%d %d %d",&x,&y,&cost);
                                  creeaza(x,y,cost);
                                 }
for (i=2;i<=n;i++) d[i]=infinite;
dijsktra();
for (i=2;i<=n;i++) if (d[i]!=infinite) fprintf(g,"%d ",d[i]);
                                        else fprintf(g,"0 ");
return 0;
}