Cod sursa(job #572335)

Utilizator andrei.finaruFinaru Andrei Emanuel andrei.finaru Data 5 aprilie 2011 11:11:43
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream.h>
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
int n,m,viz[50005],k,a,b,c,cost[50005],min;
struct nod
{ int nr;
  int c;
  nod *urm;
} *v[50005],*p;

void adaug(int a, int b, int c)
{ nod *p;
  p=new nod;
  p->nr=b;
  p->c=c;
  p->urm=v[a];
  v[a]=p;
}

void afis()
{ int i;
  for(i=2;i<=n;i++) g<<cost[i]<<' ';
  g<<'\n';
  /*for(i=1;i<=n;i++) g<<inainte[i]<<' ';
  g<<'\n';*/
}

void dijkstra(int i)
{ int j,q;
  //for(j=1;j<=n;j++) inainte[j]=i;
  //inainte[i]=0;
  viz[i]=1;
  p=v[i];
  while(p) cost[p->nr]=p->c, p=p->urm;
  for(j=2;j<n;j++) 
	  { min=1;
	    while(viz[min]||!cost[min]) min++;
		for(q=min+1;q<=n;q++) 
			if(!viz[q]&&cost[q]&&cost[q]<cost[min]) min=q;
		viz[min]=1;
		p=v[min];
		while(p)
			{ if((!cost[p->nr]||cost[p->nr]>cost[min]+p->c)&&!viz[p->nr]) 
				  cost[p->nr]=cost[min]+p->c/*,inainte[p->nr]=min*/;
			  p=p->urm;
			}
	  }
  afis();
}

int main()
{ int i;
  f>>n>>m;
  for(i=1;i<=m;i++)
	  { f>>a>>b>>c;
	    adaug(a,b,c);
		adaug(b,a,c);
	  }
  dijkstra(1);
  f.close(); g.close();
  return 0;
}