Cod sursa(job #76293)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 9 august 2007 10:47:55
Problema Drumuri minime Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
# include <stdio.h>
# include <math.h>
# include <stdlib.h>

const double EPSILON=0.00000001;
const double INFINIT=1000000;
const long int MAXN=1500;

typedef struct NODL{long int inf; double cost; NODL *next;};
struct {NODL *prim,*ultim;} ladiac[MAXN+1];
long int n,m;
double r[MAXN+1];long int heaplen,nr[MAXN+1],heap[MAXN+1],index[MAXN+1];

void add(long int loc, long int inf, double cost)
{
NODL *p;
p=(NODL*) malloc (sizeof(NODL));
(*p).next=NULL;
(*p).inf=inf;
(*p).cost=cost;
if (ladiac[loc].prim==NULL)
	{
	ladiac[loc].prim=p;
	ladiac[loc].ultim=p;
	}
else
	{
	(*ladiac[loc].ultim).next=p;
	ladiac[loc].ultim=p;
	}
}

void citire()
{
FILE *f=fopen("dmin.in","r");
fscanf(f,"%ld%ld",&n,&m);
long int i,aa,bb,cc;double cost;
for (i=1;i<=m;i++)
	{
	fscanf(f,"%ld%ld%ld",&aa,&bb,&cc);
	cost=cc;
	add(aa,bb,cost);
	add(bb,aa,cost);
	}
fclose(f);
}

void float_heap(long int i)
{
long int aux;
while (i/2&&r[heap[i/2]]>r[heap[i]])
	{
	aux=heap[i];
	heap[i]=heap[i/2];
	heap[i/2]=aux;
	index[heap[i]]=i;
	index[heap[i/2]]=i/2;
	i/=2;
	}
}

int submerge_heap(long int i)
{
long int min,aux;
do
	{
	min=i;
	if (i*2<=heaplen&&r[heap[i*2]]<r[heap[min]]) min=i*2;
	if (i*2+1<=heaplen&&r[heap[i*2+1]]<r[heap[min]]) min=i*2+1;
	if (i==min) return 0;
	aux=heap[i];
	heap[i]=heap[min];
	heap[min]=aux;
	index[heap[i]]=i;
	index[heap[min]]=min;
	}
while (1);
}

void extract_heap(long int &x)
{
x=heap[1];
index[heap[1]]=0;
heap[1]=heap[heaplen];
index[heap[1]]=1;
heap[heaplen]=0;
heaplen--;
submerge_heap(1);
}

double modul(double a) {if (a>=0) return a; return -a;}

void update(long int nod)
{
NODL *p=ladiac[nod].prim;
long int i;
while (p)
	{
	i=(*p).inf;
	//if (index[i]==0)
	if (index[i]!=0)
		{
		if (r[i]>r[nod]*(*p).cost)
			{
			r[i]=r[nod]*(*p).cost;
			float_heap(index[i]);
			nr[i]=nr[nod];
			}
		else if (r[nod]*(*p).cost==r[i])
			nr[i]+=nr[nod];
		}
	p=(*p).next;
	}
}

void create_heap()
{
long int i;
for (i=2;i<=n;i++) r[i]=INFINIT;
NODL *p=ladiac[1].prim;
while (p)
	{
	r[(*p).inf]=(*p).cost;
	nr[(*p).inf]=1;
	p=(*p).next;
	}
for (i=2;i<=n;i++)
	{
	heap[++heaplen]=i;
	index[heap[heaplen]]=heaplen;
	float_heap(heaplen);
	}
}

void dijkstra()
{
long int a;
create_heap();
while (heaplen)
	{
	extract_heap(a);
	update(a);
	}
}

void scrie()
{
long int i;
FILE *g=fopen("dmin.out","w");
if (n>1) fprintf(g,"%ld",nr[2]);
for (i=3;i<=n;i++) fprintf(g," %ld",nr[i]);
fprintf(g,"\n");
fcloseall();
}

int main()
{
citire();
dijkstra();
scrie();
return 0;
}