Source code for submission s1057

Go to diff to previous submission

fr.cpp

  1. #include <cstdio>
  2. #include <queue>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. int N, C;
  9.  
  10. struct Dvojice
  11. {
  12. int vrchol;
  13. int cena;
  14. };
  15.  
  16. struct Prvek
  17. {
  18. int index;
  19. bool existuje;
  20. bool koren;
  21. vector<Dvojice> sousede;
  22. int synu;
  23. int soucet;
  24. } pole[1005];
  25.  
  26. int main()
  27. {
  28. int a,b,c;
  29. Prvek prvek;
  30. Dvojice dvojice;
  31.  
  32. while(scanf("%d", &N) != EOF)
  33. {
  34. //printf("Nacitani:\n");
  35. scanf("%d", &C);
  36.  
  37. for(int i=1; i<=N; i++)
  38. {
  39. pole[i].index = i;
  40. pole[i].existuje = true;
  41. pole[i].koren = false;
  42. pole[i].soucet = 0;
  43. pole[i].synu = 0;
  44. /**
  45.   while(pole[i].sousede.size() > 0)
  46.   pole[i].sousede.pop_back();
  47.   **/
  48. pole[i].sousede.clear();
  49. }
  50. for(int i=1; i<=N-1; i++)
  51. {
  52. //printf("%d-ty:\n", i);
  53. scanf("%d%d%d", &a, &b, &c);
  54. /**
  55.   pole[b].otec = a;
  56.   pole[b].value = c;
  57.   pole[b].synu = 0;
  58.   pole[a].synu++;
  59.   pole[b].soucet = 0;
  60.   **/
  61.  
  62. dvojice.vrchol = b;
  63. dvojice.cena = c;
  64. pole[a].sousede.push_back(dvojice);
  65. pole[a].synu++;
  66. dvojice.vrchol = a;
  67. pole[b].sousede.push_back(dvojice);
  68. pole[b].synu++;
  69. }
  70. pole[C].koren = true;
  71.  
  72. /**
  73.   for(int i=1; i<=N; i++)
  74.   {
  75.   printf("%d) index=%d exist=%d koren=%d synu=%d souc=%d ... ", i, pole[i].index, pole[i].existuje, pole[i].koren, pole[i].synu, pole[i].soucet);
  76.   for(int j=0; j<pole[i].sousede.size(); j++)
  77.   {
  78.   printf("[%d,%d] ", pole[i].sousede.at(j).vrchol, pole[i].sousede.at(j).cena);
  79.   }
  80.   printf("\n");
  81.   }
  82. **/
  83.  
  84. if(N == 2)
  85. {
  86. printf("%d\n", pole[1].sousede.at(0).cena);
  87. continue;
  88. }
  89.  
  90. queue<Prvek> fronta;
  91. for(int i=1; i<=N; i++)
  92. {
  93. if(pole[i].synu == 1) // && pole[i].koren == false) // 1 soused
  94. {
  95. pole[i].soucet = 123456789;
  96. fronta.push(pole[i]);
  97. //printf("frona.push(%d)\n", i);
  98. }
  99. }
  100.  
  101. while(!fronta.empty())
  102. {
  103. prvek = fronta.front();
  104. fronta.pop();
  105.  
  106. /**
  107.   printf("\n\n\n\n\nFRONTA:\n");
  108.   printf("PRVEK[%d]\n", prvek.index);
  109.   for(int i=1; i<=N; i++)
  110.   {
  111.   printf("%d) index=%d exist=%d koren=%d synu=%d souc=%d ... ", i, pole[i].index, pole[i].existuje, pole[i].koren, pole[i].synu, pole[i].soucet);
  112.   for(int j=0; j<pole[i].sousede.size(); j++)
  113.   {
  114.   printf("[%d,%d] ", pole[i].sousede.at(j).vrchol, pole[i].sousede.at(j).cena);
  115.   }
  116.   printf("\n");
  117.   }
  118.   printf("\n");
  119. **/
  120.  
  121.  
  122. if(prvek.koren == false) // ne centralni prvek
  123. {
  124. for(int i=0; i<prvek.sousede.size(); i++)
  125. {
  126. if(pole[prvek.sousede.at(i).vrchol].existuje == true)
  127. {
  128. dvojice = prvek.sousede.at(i);
  129. break;
  130. }
  131. }
  132. //printf("pole[%d]->otec: [%d,%d]\n", prvek.index, dvojice.vrchol, dvojice.cena);
  133. if(prvek.soucet <= dvojice.cena)
  134. {
  135. pole[dvojice.vrchol].soucet += prvek.soucet;
  136. //printf("1) pole[%d].soucet += %d\n", dvojice.vrchol, prvek.soucet);
  137. }
  138. else
  139. {
  140. pole[dvojice.vrchol].soucet += dvojice.cena;
  141. //printf("2) pole[%d].soucet += %d\n", dvojice.vrchol, dvojice.cena);
  142. }
  143. pole[prvek.index].existuje = false;
  144. pole[dvojice.vrchol].synu--;
  145. if(pole[dvojice.vrchol].synu == 1)
  146. fronta.push(pole[dvojice.vrchol]); // posledni prikaz bloku!!
  147. }
  148. else
  149. {
  150. printf("%d\n", pole[prvek.index].soucet); // VYSLEDEK
  151. break;
  152. }
  153.  
  154. /**
  155.   printf("KONEC:\n");
  156.   for(int i=1; i<=N; i++)
  157.   {
  158.   printf("%d) index=%d exist=%d koren=%d synu=%d souc=%d ... ", i, pole[i].index, pole[i].existuje, pole[i].koren, pole[i].synu, pole[i].soucet);
  159.   for(int j=0; j<pole[i].sousede.size(); j++)
  160.   {
  161.   printf("[%d,%d] ", pole[i].sousede.at(j).vrchol, pole[i].sousede.at(j).cena);
  162.   }
  163.   printf("\n");
  164.   }
  165.   **/
  166. }
  167.  
  168. //printf("Konec_Vypoctu\n");
  169. // ṕro jistotu
  170. while(!fronta.empty())
  171. fronta.pop();
  172.  
  173. }
  174.  
  175. return 0;
  176. }
  177.  

Diff to submission s1023

fr.cpp

--- c5.s1023.cteam093.fr.cpp.0.fr.cpp
+++ c5.s1057.cteam093.fr.cpp.0.fr.cpp
@@ -82,9 +82,14 @@
 **/
 
+        if(N == 2)
+        {
+            printf("%d\n", pole[1].sousede.at(0).cena);
+            continue;
+        }
 
         queue<Prvek> fronta;
         for(int i=1; i<=N; i++)
         {
-            if(pole[i].synu == 1) // 1 soused
+            if(pole[i].synu == 1) // && pole[i].koren == false) // 1 soused
             {
                 pole[i].soucet = 123456789;