Pagini recente » Cod sursa (job #36449) | Cod sursa (job #992899) | Cod sursa (job #488347) | Cod sursa (job #882085) | Cod sursa (job #1747495)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int n,m,i,j;
int costminim[50010];
int heap[50010],nc;
void ins(int x)
{
heap[++nc]=x;
int i=nc;
while (i>1&&costminim[heap[i/2]]>costminim[x])
swap(heap[i],heap[i/2]),i/=2;
}
void elim()
{
heap[1]=heap[nc--];
heap[nc+1]=50000002;
int i=1;
bool ok=1;
while ((2*i<=nc)&&(costminim[heap[2*i]]<costminim[heap[i]]||costminim[heap[2*i+1]]<costminim[heap[i]]))
{
if (costminim[heap[2*i]]<costminim[heap[2*i+1]])
swap(heap[i],heap[2*i]),i=i*2;
else if (2*i+1>nc) break;
else swap(heap[i],heap[2*i+1]),i=i*2+1;
}
}
vector <int> v[50010],cost[50010];
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1; i<=m; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
v[a].push_back(b);
cost[a].push_back(c);
}
for (i=2; i<=n; i++)
costminim[i]=50000001,heap[i]=50000002;
heap[++nc]=1;
while (nc)
{
int x=heap[1];
elim();
for (i=0; i<v[x].size(); i++)
if (costminim[x]+cost[x][i]<costminim[v[x][i]])
{
costminim[v[x][i]]=cost[x][i]+costminim[x];
ins(v[x][i]);
}
}
for (i=2; i<=n; i++)
if (costminim[i]!=50000001)
printf("%d ",costminim[i]);
else printf("0 ");
printf("\n");
}