fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4.  
  5. const int N=1e6;
  6.  
  7. int d()
  8. {
  9. int ret;
  10. scanf("%d", &ret);
  11. return ret;
  12. }
  13. long long lld()
  14. {
  15. long long ret;
  16. scanf("%lld", &ret);
  17. return ret;
  18. }
  19. int n,m,OO = 0x3f3f3f3f;
  20. vector<pair<int,int>>adj[N];
  21. int dis[N];
  22. int parent[N];
  23. void dijkstra(int src){
  24. memset(dis,OO,sizeof dis);
  25. dis[src]=0;
  26. priority_queue<pair<int ,int>>q;
  27. q.push({0,src});
  28. parent[0]=0;
  29. while(!q.empty()){
  30. int uc=-q.top().first;
  31. int u=q.top().second;
  32. q.pop();
  33. if(uc!=dis[u]) continue;
  34. for(pair<int,int> p : adj[u]){
  35. int c=p.first;
  36. int v=p.second;
  37. if(dis[v]> dis[u]+c){
  38. dis[v]=dis[u]+c;
  39. q.push({-dis[v],v});
  40. parent[v]=u;
  41. }
  42.  
  43. }
  44.  
  45. }
  46. }
  47. int main()
  48. {
  49. n=d(),m=d();
  50. for(int i=0; i<m; i++)
  51. {
  52. int u=d(),v=d(),c=d();
  53. u--;
  54. v--;
  55. adj[u].push_back({c,v});
  56. adj[v].push_back({c,u});
  57. }
  58. dijkstra(0);
  59. for(int i=0;i<n;i++){
  60. cout<<dis[i]<<" ";
  61. }
  62. puts("");
  63. for(int i=0;i<n;i++) {
  64. cout<<i+1<<" "<<parent[i]+1<<endl;
  65. }
  66. }
  67.  
Success #stdin #stdout 0.01s 31008KB
stdin
5 6
1 2 2
2 5 5
2 3 4
1 4 1
4 3 3
3 5 1
stdout
0 2 4 1 5 
1 1
2 1
3 4
4 1
5 3