Pagini recente » Cod sursa (job #32017) | Cod sursa (job #3152549) | Cod sursa (job #2483244) | Cod sursa (job #2020373) | Cod sursa (job #1713741)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
#define Nmax 66613
#define start 1
#define INF 0x3f3f3f3f
using namespace std;
vector<pair<int,int> > G[Nmax];
priority_queue<pair<int,int> > Q;
int N,M;
int best[Nmax],delta[Nmax],tree_dad[Nmax];
void Read()
{
int a,b,c;
scanf("%d%d",&N,&M);
for(int i = 1; i <= M; ++i)
{
scanf("%d%d%d",&a,&b,&c);
G[a].push_back({c,b});
}
}
void Dijkstra(int k)
{/// O( (N+M)log(N+M) )
memset(best,INF,sizeof(best));
best[k] = 0;
memset(delta,INF,sizeof(delta));
delta[k] = 0;
Q.push({0,k});
int cost;
while(!Q.empty())
{
k = Q.top().second;
cost = -Q.top().first;
delta[k] = best[k];
Q.pop();
if(delta[k] < cost)
continue; /// optimize the priority queue
for(auto it : G[k])
if(best[it.second] > best[k] + it.first)
{
tree_dad[it.second] = k;
best[it.second] = best[k] + it.first;
Q.push({-best[it.second],it.second});
}
}
for(int i = 1; i <= N; ++i)
if(i != start)
{
if(delta[i] == INF)
printf("0 ");
else
printf("%d ",delta[i]);
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
Read();
Dijkstra(start);
return 0;
}