Pagini recente » Cod sursa (job #2106189) | Cod sursa (job #1256559) | Cod sursa (job #2854359) | Cod sursa (job #337759) | Cod sursa (job #1120271)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define NMAX 50002
#define INF 10000000
using namespace std;
FILE *fin,*fout;
struct muchie {int vf,cost;};
struct hip{int nod,cost;
bool operator< (hip &xx) {return cost>xx.cost; }};
int n,m;
vector <muchie> L[NMAX];
vector <hip> cmin;
int dmin[NMAX],M[NMAX];
using namespace std;
void citire()
{
int a,b,c;
muchie aux;
fin=fopen("dijkstra.in","r");
fscanf(fin,"%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
fscanf(fin,"%d%d%d",&a,&b,&c);
aux.vf=b; aux.cost=c;
L[a].push_back(aux);
}
}
void dijkstra()
{
int vfmin,i;
hip aux2;
//init
for(i=1;i<=n;i++) dmin[i]=INF;
for(i=0;i<L[1].size();i++)
{
dmin[L[1][i].vf]=L[1][i].cost;
aux2.nod=L[1][i].vf; aux2.cost=L[1][i].cost;
cmin.push_back(aux2);
}
dmin[1]=0; M[1]=0;
make_heap(cmin.begin(),cmin.end());
//
while(!cmin.empty())
{
aux2=cmin.front();
pop_heap(cmin.begin(),cmin.end());
cmin.pop_back();
vfmin=aux2.nod;
M[vfmin]=1;
for(i=0;i<L[vfmin].size();i++)
{
if(M[L[vfmin][i].vf]==0)
{
if(dmin[L[vfmin][i].vf]>dmin[vfmin]+L[vfmin][i].cost)
{
dmin[L[vfmin][i].vf]=dmin[vfmin]+L[vfmin][i].cost;
aux2.nod=L[vfmin][i].vf; aux2.cost=L[vfmin][i].cost;
cmin.push_back(aux2);
push_heap(cmin.begin(),cmin.end());
}
}
}
}
fout=fopen("dijkstra.out","w");
for (i=2; i<=n; ++i)
if (dmin[i]!=10000000) fprintf (fout, "%d ", dmin[i]); else fprintf (fout, "0 ");
}
int main()
{
citire();
dijkstra();
return 0;
}