Advertisement
a53

Ateleport

a53
Mar 11th, 2020
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. /// prof. Ionel-Vasile Pit-Rada
  2. /// Colegiul National Traian din Drobeta Turnu Severin
  3.  
  4. ///Dijkstra
  5. #include <fstream>
  6. using namespace std;
  7. ifstream fin("ateleport.in");
  8. ofstream fout("ateleport.out");
  9. int N,M,P,L,K,k,i,x,y,z,c,t,nh,x1,y1,z1,c1;
  10. int start[10002],d[10002][11][11],poz[10002][11][11];
  11. char viz[10002][11][11];
  12. struct legatura{
  13. int vecin,cost,leg;
  14. }V[20002];
  15. struct nodh{
  16. int v,k,l,c;
  17. }H[1000002];
  18. void urcare(int q){
  19. while(q>=2 && H[q/2].c>H[q].c){
  20. poz[H[q].v][H[q].k][H[q].l]=q/2;
  21. poz[H[q/2].v][H[q/2].k][H[q/2].l]=q;
  22. nodh x=H[q/2]; H[q/2]=H[q]; H[q]=x;
  23. q=q/2;
  24. }
  25. }
  26. void coborare(int q){
  27. while(2*q<=nh){
  28. int r=2*q;
  29. if(r+1<=nh && H[r].c>H[r+1].c)r++;
  30. if(H[q].c>H[r].c){
  31. poz[H[q].v][H[q].k][H[q].l]=r;
  32. poz[H[r].v][H[r].k][H[r].l]=q;
  33. nodh x=H[q]; H[q]=H[r]; H[r]=x;
  34. q=r;
  35. }
  36. else break;
  37. }
  38. }
  39. int main(){
  40. fin>>N>>M>>P>>L>>K;
  41. k=0;
  42. for(i=1;i<=M;i++){
  43. fin>>x>>y>>t;
  44. k++; V[k]={y,t,start[x]}; start[x]=k;
  45. k++; V[k]={x,t,start[y]}; start[y]=k;
  46. }
  47. for(x=1;x<=N;x++){
  48. for(y=0;y<=K;y++){
  49. for(z=0;z<=L;z++){
  50. d[x][y][z]=1000000000;
  51. }
  52. }
  53. }
  54. d[1][0][0]=0;
  55. nh=1; H[1]={1,0,0,0};
  56. poz[1][0][0]=1;
  57. viz[1][0][0]=1;
  58. do{
  59. x=H[1].v;y=H[1].k;z=H[1].l;c=d[x][y][z];
  60. viz[x][y][z]=0;
  61.  
  62. H[1]=H[nh];
  63. poz[H[nh].v][H[nh].k][H[nh].l]=1;
  64. nh--;
  65. coborare(1);
  66. for(int i=start[x];i;i=V[i].leg){
  67. ///fara teleportare
  68. x1=V[i].vecin;c1=V[i].cost;
  69. if(z==0){y1=y;z1=0;}
  70. else {y1=y+1;z1=0;}
  71. if(c+c1<d[x1][y1][z1]){
  72. d[x1][y1][z1]=c+c1;
  73. if(viz[x1][y1][z1]==0){
  74. nh++; H[nh]={x1,y1,z1,c+c1};
  75. poz[x1][y1][z1]=nh;
  76. urcare(nh);
  77. viz[x1][y1][z1]=1;
  78. }
  79. else{
  80. H[poz[x1][y1][z1]].c=c+c1;
  81. urcare(poz[x1][y1][z1]);
  82. }
  83. }
  84. if(K>0){
  85. ///cu teleportare
  86. if(y==K)continue;
  87. if(z==0)c1=P;
  88. else c1=0;
  89. y1=y;z1=z+1;
  90. if(z1==L){
  91. z1=0;
  92. y1=y+1;
  93. }
  94. if(c+c1<d[x1][y1][z1]){
  95. d[x1][y1][z1]=c+c1;
  96. if(viz[x1][y1][z1]==0){
  97. nh++; H[nh]={x1,y1,z1,c+c1};
  98. poz[x1][y1][z1]=nh;
  99. urcare(nh);
  100. viz[x1][y1][z1]=1;
  101. }
  102. else{
  103. H[poz[x1][y1][z1]].c=c+c1;
  104. urcare(poz[x1][y1][z1]);
  105. }
  106. }
  107. }
  108. }
  109. }
  110. while(nh>0);
  111. int vmin=d[N][K][0];
  112. for(y=0;y<=K-1;y++){
  113. for(z=0;z<=L-1;z++){
  114. vmin=min(vmin,d[N][y][z]);
  115. }
  116. }
  117. fout<<vmin<<"\n";
  118. fout.close(); fin.close();
  119. return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement