Pagini recente » Cod sursa (job #1537853) | Cod sursa (job #1476572) | Cod sursa (job #1947991) | Cod sursa (job #2002774) | Cod sursa (job #1532959)
#include <cstdio>
#include <cmath>
#define INF 1000000000000000.0
#define EPS 0.00000001
#define MAXN 1500
#define MAXM 2500
bool ok[MAXN+1];
int q, n, heap[MAXN], poz[MAXN+1], val[2*MAXM+1], next[2*MAXM+1], lista[MAXN+1], nr[MAXN+1];
double d[MAXN+1], cost[2*MAXM+1];
inline int tata(int p){
return (p-1)/2;
}
inline int fiust(int p){
return 2*p+1;
}
inline int fiudr(int p){
return 2*p+2;
}
inline void swap(int a, int b){
int aux=heap[a];
heap[a]=heap[b];
heap[b]=aux;
poz[heap[a]]=a;
poz[heap[b]]=b;
}
inline void urcare(int p){
while((p>0)&&(d[heap[p]]-d[heap[tata(p)]]<-EPS)){
swap(p, tata(p));
p=tata(p);
}
}
inline void coborare(int p){
int q, f=1;
while((f)&&(fiust(p)<n)){
q=fiust(p);
if((fiudr(p)<n)&&(d[heap[fiudr(p)]]-d[heap[q]]<-EPS)){
q=fiudr(p);
}
if(d[heap[q]]-d[heap[p]]<-EPS){
swap(p, q);
p=q;
}else{
f=0;
}
}
}
inline void adauga(int x, int y, double z){
q++;
val[q]=y;
cost[q]=z;
next[q]=lista[x];
lista[x]=q;
}
int main(){
int m, i, x, y, z, p;
FILE *fin, *fout;
fin=fopen("dmin.in", "r");
fout=fopen("dmin.out", "w");
fscanf(fin, "%d%d", &n, &m);
for(i=0; i<m; i++){
fscanf(fin, "%d%d%d", &x, &y, &z);
adauga(x, y, log(z));
adauga(y, x, log(z));
}
for(i=2; i<=n; i++){
nr[i]=0;
d[i]=INF;
heap[i-1]=i;
poz[i]=i-1;
}
d[1]=0;
nr[1]=1;
heap[0]=1;
while(d[heap[0]]!=INF){
p=lista[heap[0]];
while(p){
if((ok[val[p]]==0)&&(d[heap[0]]+cost[p]-d[val[p]]<EPS)){
if(d[heap[0]]+cost[p]-d[val[p]]<-EPS){
d[val[p]]=d[heap[0]]+cost[p];
nr[val[p]]=nr[heap[0]];
urcare(poz[val[p]]);
}else{
nr[val[p]]+=nr[heap[0]];
}
}
p=next[p];
}
d[heap[0]]=INF;
ok[heap[0]]=1;
coborare(0);
}
for(i=2; i<=n; i++){
fprintf(fout, "%d ", nr[i]);
}
fclose(fin);
fclose(fout);
return 0;
}