Cod sursa(job #202665)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 10 august 2008 14:38:18
Problema Algoritmul lui Dijkstra Scor 20
Compilator c Status done
Runda Arhiva educationala Marime 2.26 kb
#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;
}