Pagini recente » Cod sursa (job #1675214) | Cod sursa (job #891232) | Cod sursa (job #2785910) | Cod sursa (job #2313099) | Cod sursa (job #1266953)
#include <cstdio>
#include <vector>
#define NMAX 50004
#define INF 1000000000
using namespace std;
FILE*fin=fopen("dijkstra.in", "r");
FILE*fout=fopen("dijkstra.out", "w");
int n, m, x0;
struct vecin
{
int varf;
int cost;
};
vector <vecin> A[NMAX];
int cmin[NMAX], prec[NMAX];
bool Z[NMAX];
void citire();
void dijkstra();
void initializare();
void afisare();
int main()
{
citire();
dijkstra();
afisare();
return 0;
}
void citire()
{
int i, x, y, c;
vecin v;
fscanf(fin, "%d %d\n", &n, &m);
for(i=1;i<=m;i++)
{
fscanf(fin, "%d %d %d\n", &x, &y, &c);
v.varf=y; v.cost=c;
A[x].push_back(v);
}
x0=1;
initializare();
}
void initializare()
{
int i, lg;
for(i=1;i<=n;i++)
{
cmin[i]=INF;
prec[i]=x0;
}
cmin[x0]=0; prec[x0]=0; Z[x0]=1;
lg=A[x0].size();
for(i=0;i<lg;i++)
cmin[A[x0][i].varf]=A[x0][i].cost;
}
void dijkstra()
{
int i, j, lg;
int minim;
cmin[0]=INF;
for(i=2;i<=n;i++)
{
minim=0;
for(j=1;j<=n;j++)
if(!Z[j] && cmin[j]<cmin[minim])
minim=j;
if(!minim)
return;
Z[minim]=1;
lg=A[minim].size();
for(j=0;j<lg;j++)
if(!Z[A[minim][j].varf] && cmin[A[minim][j].varf]>cmin[minim]+A[minim][j].cost)
{
cmin[A[minim][j].varf]=cmin[minim]+A[minim][j].cost;
prec[A[minim][j].varf]=minim;
}
}
}
void afisare()
{
int i;
for(i=1;i<x0;i++)
if(cmin[i]==INF) fprintf(fout, "0 ");
else fprintf(fout, "%d ", cmin[i]);
for(i=x0+1;i<=n;i++)
if(cmin[i]==INF) fprintf(fout, "0 ");
else fprintf(fout, "%d ", cmin[i]);
fprintf(fout, "\n");
}