Cod sursa(job #203559)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 17 august 2008 14:44:55
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <stdio.h>
#define N 50005
#define M 250005
#define st(x) 2*(x)
#define dr(x) 2*(x)+1
#define pr(x) (x)/2
long n,m;
long p[N];//200k
struct vecin
{int cost;
 long urm;
 unsigned int nod;
}v[2*M];//4000k
long vv;

long h[M];//300k
long vh;

long pheap[N];//200k
long cost[N];//200k
int flagn[N];//100k
int flagf[N];//100k

void adauga_muchie(long a,long b,int c)
{vv++;
 v[vv].urm=p[a];
 p[a]=vv;
 v[vv].nod=b;
 v[vv].cost=c;
}

void interschimba (long a,long b)
{long aux;
 aux=h[a];
 h[a]=h[b];
 h[b]=aux;
 pheap[h[a]]=a;
 pheap[h[b]]=b;
}
void adauga_heap(long nod,long c)
{vh++;
 long i;
 h[vh]=nod;
 cost[nod]=c;
 for (i=vh;cost[h[i]]<cost[h[pr(i)]]&&pr(i);i=pr(i))
 {interschimba(i,pr(i));
 }
}

void adauga_vecini(long a)
{long q,i;
 for (q=p[a];q!=0;q=v[q].urm)
 {if(flagf[v[q].nod]==0)
  {if(flagn[v[q].nod]==0)
   {adauga_heap(v[q].nod,v[q].cost+cost[a]);
    flagf[v[q].nod]=1;
   }
  }
  else
  {if(cost[v[q].nod]>cost[a]+v[q].cost)
   {cost[v[q].nod]=cost[a]+v[q].cost;
    for (i=pheap[v[q].nod];cost[h[i]]<cost[h[pr(i)]]&&pr(i);i=pr(i))
    {interschimba(i,pr(i));
    }
   }
  }
 }
}

void sift(long k)
{long min=k;
 if(st(k)<=vh&&cost[h[st(k)]]<cost[h[k]])
 {min=st(k);
 }
 if(dr(k)<=vh&&cost[h[dr(k)]]<cost[h[min]])
 {min=dr(k);
 }
 if(min!=k)
 {interschimba(k,min);
  sift(min);
 }
}

void scoate_minim()
{flagf[h[1]]=0;
 flagn[h[1]]=1;

 pheap[h[1]]=0;
 h[1]=h[vh];
 pheap[h[1]]=1;
 vh--;

 sift(1);
}

int main ()
{long a,b;int c;long i;
 long min;
 freopen("dijkstra.in","r",stdin);
 freopen("dijkstra.out","w",stdout);
 scanf("%ld%ld",&n,&m);
 for (vv=0,i=1;i<=m;i++)
 {scanf("%u%u%d",&a,&b,&c);
  adauga_muchie(a,b,c);
 }

 flagn[1]=1;
 cost[1]=0;
 adauga_vecini(1);
 for (i=1;i<=n;i++)
 {min=h[1];
//  cost[min.nod]=min.cost;
  scoate_minim();
  adauga_vecini(min);
 }
 
 for (i=2;i<=n;i++)
 {printf("%ld ",cost[i]);
 }
 
 return 0;
}