Pagini recente » Cod sursa (job #1402939) | Cod sursa (job #2426108) | Cod sursa (job #1641393) | Cod sursa (job #1529497) | Cod sursa (job #381782)
Cod sursa(job #381782)
using namespace std;
#include <cstdio>
#include <vector>
#define NN 50005
#define INFINIT 1<<30
struct nod{
int capat,cost;
nod * next;
};
nod * G[NN];
int n,v[NN],d[NN],t[NN];
void addArc(int i,int j,int c)
{
nod *p=new nod;
p->capat=j , p->cost=c;
p->next=G[i];
G[i] = p;
}
void init(int sursa)
{
for(int i=0;i<=n;++i)
v[i]=0,t[i]=-1,d[i]=INFINIT;
v[sursa]=1;
t[sursa]=0;
d[sursa]=0;
for(nod *p=G[sursa]; p ; p=p->next)
t[p->capat]=sursa, d[p->capat]=p->cost;
}
void dijkstra(int sursa)
{
init(sursa);
int gata=0;
while(!gata)
{
int pmin=0;
for(int i=1;i<=n;++i)
if(v[i]==0 && d[i]<d[pmin])
pmin=i;
if(pmin==0)
gata=1;
else
{
v[pmin]=1;
for(nod* p=G[pmin] ; p ; p=p->next)
if(v[p->capat]==0)
if(d[p->capat]>d[pmin]+p->cost)
d[p->capat] = d[pmin]+p->cost, t[p->capat]=pmin;
}
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
int m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
G[i]=NULL;
for( ; m ;--m)
{
int i,j,c;
scanf("%d%d%d",&i,&j,&c);
addArc(i,j,c);
}
dijkstra(1);
for(int i=1;i<=n;++i)
printf("%d ",t[i]);
freopen("dijkstra.out","w",stdout);
for(int i=2;i<=n;++i)
printf("%d ",d[i]!=INFINIT?d[i]:0);
printf("\n");
return 0;
}