Pagini recente » Cod sursa (job #1351801) | Cod sursa (job #1643153) | Cod sursa (job #1701349) | Cod sursa (job #2342028) | Cod sursa (job #642193)
Cod sursa(job #642193)
# include <cstdio>
# include <algorithm>
# include <set>
# define cost first
# define nod second
using namespace std;
set < pair<int,int> > s;
char fin[50001];
int drum[50001],ind[50001];
struct date
{
int a,b,co;
};
date v[250001];
int cmp(date x, date y)
{
return x.a<y.a;
}
int main ()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
int n,m,aa,bb,c,l=0,curent=1,fi=1;
scanf ("%d%d",&n,&m);
for (int i=1; i<=m;i++)
{
scanf ("%d%d%d",&aa,&bb,&c);
v[++l].a=aa;
v[l].b=bb;
v[l].co=c;
}
for (int i=1;i<=n;i++)
drum[i]=2000000;
for (int i = 1; i <= n; i++) {
v[m + i].a = i;
v[m + i].b = i;
v[m + i].co = 0;
}
sort (v+1,v+m+n+1,cmp);
for (;v[curent].a==1;curent++)
{
s.insert(make_pair(v[curent].co,v[curent].b));
fin[v[curent].b]=1;
}
for (int i=2; i<=n;i++)
s.insert(make_pair(2000000,i));
s.insert(make_pair(0,1));
v[n + m + 1].a = n + 1;
for (int i=curent;i<=m+n + 1;i++)
if (v[i].a!=v[i-1].a)
ind[v[i].a]=i;
/*for (int i = 1; i <= n; i++)
printf("%d %d\n", ind[i], ind[i + 1]);
printf("\n");*/
for (;fi<=n;fi++)
{
int act=s.begin()->nod;
drum[act]=s.begin()->cost;
fin[act]=1;
s.erase(make_pair(drum[act],act));
for (int i=ind[act];i<ind[act+1];i++)
if (drum[v[i].b]>(v[i].co+drum[v[i].a]))
{
s.erase(make_pair(drum[v[i].b],v[i].b));
s.insert(make_pair(drum[v[i].a]+v[i].co,v[i].b));
drum[v[i].b]=drum[v[i].a]+v[i].co;
//printf(" %d %d %d\n", v[i].a, v[i].b, v[i].co);
}
//printf("%d %d\n", act, drum[act]);
}
for (int i=2; i<=n;i++)
if (drum[i]==2000000)
printf("0 ");
else
printf ("%d ",drum[i]);
return 0;
}