Pagini recente » Cod sursa (job #1735463) | Istoria paginii runda/oji2004bad | Cod sursa (job #1526970) | Cod sursa (job #1507739) | Cod sursa (job #912838)
Cod sursa(job #912838)
#include<cstdio>
#include<vector>
using namespace std;
int nr2,aux,nr,x1,y1,c1,i,n,m,ul,heap[50009],b[50009],poz[50009],c[50009];
vector < pair < int , int > > v[50009];
vector < pair < int , int > >::iterator it;
int cmp(int p1,int p2)
{
///////1 dac p1<=p2
if(b[heap[p1]]<=b[heap[p2]]) return 1;
return 0;
}
void swap(int p1,int p2)
{
int aux=heap[p1];
poz[aux]=p2;
poz[heap[p2]]=p1;
heap[p1]=heap[p2];
heap[p2]=aux;
}
void heapup(int p)
{
if(p==1) return ;
if(!cmp(p>>1,p))
{
swap(p>>1,p);
heapup(p>>1);
}
}
void heapdown(int p)
{
int f;
if((p<<1)>nr) return ;
f=(p<<1);
if(f+1<=nr&&cmp(f+1,f))
f++;
if(cmp(f,p))
{
swap(f,p);
heapdown(f);
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&x1);
scanf("%d",&y1);
scanf("%d",&c1);
v[x1].push_back(make_pair(y1,c1));
}
ul=1;
b[1]=0;
for(i=2;i<=n;i++)
{
b[i]=c[i]=10000000;
nr++;
heap[nr]=i;
poz[i]=nr;
}
nr2=nr;
while(1)
{
for(it=v[ul].begin();it!=v[ul].end();it++)
if(c[ul]+it->second<c[it->first])
{
if(b[it->first]==100000000)
{
c[it->first]=c[ul]+it->second;
continue;
}
c[it->first]=b[it->first]=c[ul]+it->second;
heapup(poz[it->first]);
}
if(nr2==0) break;
ul=heap[1];
b[ul]=100000000;
nr2--;
heapdown(1);
}
for(i=2;i<=n;i++)
{
if(c[i]>=10000000) printf("0 ");
else printf("%d ",c[i]);
}
return 0;
}