Pagini recente » Cod sursa (job #461) | Cod sursa (job #1493775) | Cod sursa (job #3166307) | Cod sursa (job #112747) | Cod sursa (job #1111055)
#include <iostream>
#include <cstdio>
using namespace std;
struct nod {int inf;
int cost;
nod *next;}*prim[1001],*p,*aux;
int viz[1001],t[1001],d[1001],h[1001];
int main()
{
FILE *fin=fopen("dijkstra.in","r"),
*fout=fopen("dijkstra.out","w");
int x,y,z,i,s,f,j,c,n,m,k,l;
fscanf(fin,"%d %d",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(fin,"%d %d %d\n",&x,&y,&c);
aux=new nod;
aux->inf=y;
aux->cost=c;
aux->next=prim[x];
prim[x]=aux;
aux=new nod;
aux->inf=x;
aux->cost=c;
aux->next=prim[y];
prim[y]=aux;
}
fscanf(fin,"%d %d",&s,&f);
for(i=1;i<=n;i++) if(i!=s) t[i]=s,d[i]=99999;
viz[s]=1;
for(p=prim[s];p;p=p->next)
d[p->inf]=p->cost;
l=0;
for(i=1;i<=n;i++)
{
if(i!=s)
{
h[++l]=i;
x=l;
y=x/2;
while(y && d[h[y]]>d[h[x]])
{
z=h[x];
h[x]=h[y];
h[y]=z;
x=y;
y/=2;
}
}
}
l=n-1;
for(i=1;i<n;i++)
{
k=h[1];
viz[k]=1;
for(p=prim[k];p;p=p->next)
{
if(!viz[p->inf] && d[k]+p->cost<d[p->inf])
d[p->inf]=d[k]+p->cost,t[p->inf]=k;
}
h[1]=h[l--];
x=1;
while(1)
{
y=2*x;
if(y>l) break;
if(d[h[y]]<=l && d[h[y]]>d[h[y+1]]) y++;
if(d[h[y]]<d[h[x]])
{
z=h[x];
h[x]=h[y];
h[y]=z;
x=y;
}
else break;
}
}
fprintf(fout,"%d ",f);
while(t[f])
{
fprintf(fout,"%d ",t[f]);
f=t[f];
}
return 0;
}