Pagini recente » Cod sursa (job #2147042) | Cod sursa (job #2095105) | Cod sursa (job #2215956) | Cod sursa (job #1863238) | Cod sursa (job #202665)
Cod sursa(job #202665)
#include <stdio.h>
#define N 100
#define M 100
#define st(x) 2*(x)
#define dr(x) 2*(x)+1
#define tata(x) (x)/2
int flagf[N+1];
int flagn[N+1];
long vecin[2*M+1],pointer[N+1],vm;
long costm[2*M+1];
long urm[2*M+1];
long heap[N+1],vh;//nodurile, nu costurile!
long costn[N+1];
long costh[N+1];
void adauga_muchie(long a,long b,long c)
{vm++;
vecin[vm]=b;
costm[vm]=c;
urm[vm]=pointer[a];
pointer[a]=vm;
}
void adauga_heap(long a,long c)
{vh++;
costh[vh]=c;
heap[vh]=a;
long aux,i;
for (i=vh;i>1&&costh[i]<costh[tata(i)];i=tata(i))
{aux=heap[i];
heap[i]=heap[tata(i)];
heap[tata(i)]=aux;
aux=costh[i];
costh[i]=costh[tata(i)];
costh
[tata(i)]=aux;
}
}
void reconstruieste (long i)
{long min=i,aux;
if(st(i)<=vh&&costh[i]>costh[st(i)])
{min=st(i);}
if(dr(i)<=vh&&costh[min]>costh[dr(i)])
{min=dr(i);}
if(min!=i)
{aux=heap[i];
heap[i]=heap[min];
heap[min]=aux;
aux=costh[i];
costh[i]=costh[min];
costh[min]=aux;
reconstruieste(min);
}
}
void scoate_min()
{heap[1]=heap[vh];
costh[1]=costh[vh];
vh--;
reconstruieste(1L);
}
long cautare(long i,long n)
{if (heap[i]==n)return i;
else
{if(st(i)<=vh)
return cautare(st(i),n);
if(dr(i)<=vh)
return cautare(dr(i),n);
}
}
void adauga_vecini(long i)
{long p;
long a1,a2,j;
for (p=pointer[i];p;p=urm[p])
{if(flagf[vecin[p]]==0)
{if(flagn[vecin[p]]==0)
{adauga_heap(vecin[p],costn[i]+costm[p]);
flagf[vecin[p]]=1;
}
}
else
{if(flagf[vecin[p]]==1)//e in front
{if(costh[a1=cautare(1,vecin[p])]>costn[i]+costm[p])
{costh[a1]=costm[p]+costn[i];
//
for (j=a1;j>1&&costh[j]<costh[tata(j)];j=tata(j))
{a2=heap[j];
heap[j]=heap[tata(j)];
heap[tata(j)]=a2;
}
}
}
}
}
}
int main ()
{long n,m,i,a,b,c,a1;
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
scanf("%ld%ld",&n,&m);
for (vm=0,i=1;i<=m;i++)
{scanf("%ld%ld%ld",&a,&b,&c);
adauga_muchie(a,b,c);
}
flagn[1]=1;
costn[1]=0;
adauga_vecini(1);
for (i=1;i<n;i++)
{a1=heap[1];
costn[a1]=costh[1];
flagn[a1]=1;
flagf[a1]=0;
scoate_min();
adauga_vecini(a1);
}
for (i=2;i<=n;i++)
{printf("%ld ",costn[i]);
}
return 0;
}