Guest User

Untitled

a guest
Jul 18th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.48 KB | None | 0 0
  1. package lista3;
  2. import Arquivo;
  3.  
  4. public class L3QD {
  5. Arquivo arquivo;
  6. int elementos = 0 ;
  7. Caverna[] heap ;
  8.  
  9. public L3QD () {
  10. arquivo = new Arquivo("L3QD.in","L3QD.out");
  11. int caso = 1 ;
  12. while (!arquivo.isEndOfFile()) {
  13. int numCav = arquivo.readInt () ;
  14. int tuneis = arquivo.readInt();
  15. int hp = arquivo.readInt();
  16. int mosntros = arquivo.readInt();
  17. arquivo.print("Caso #");
  18. arquivo.println(caso);
  19. Caverna[] cavernas = new Caverna[numCav];
  20.  
  21. for (int i = 0; i < numCav; i++) {
  22. cavernas[i] = new Caverna() ;
  23. cavernas[i].numero = i ;
  24.  
  25. }
  26. for (int j = 0 ; j < tuneis ; j++) {
  27. int entrada = arquivo.readInt();
  28. int saida = arquivo.readInt();
  29. cavernas[entrada].adjacencia.inserir(new No(cavernas[saida]));
  30. cavernas[saida].adjacencia.inserir(new No(cavernas[entrada]));
  31. int tam = arquivo.readInt();
  32. cavernas[entrada].dist.inserir(tam);
  33. cavernas[saida].dist.inserir(tam);
  34. }
  35. for (int k = 0; k < mosntros; k++) {
  36. int cave = arquivo.readInt();
  37. int pontos = arquivo.readInt();
  38. cavernas[cave].perda += pontos ;
  39. }
  40. heap = new Caverna[numCav];
  41. cavernas[0].distancia = 0 ;
  42. cavernas[0].life = hp - cavernas[0].perda ;
  43. inserir(heap,cavernas[0]);
  44. rotina(cavernas);
  45.  
  46. for (int i = 0; i < numCav; i++) {
  47. if (cavernas[i].life <= 0 || cavernas[i].distancia == Integer.MAX_VALUE ) {
  48. arquivo.println("Morte certa!");
  49. }
  50. else {
  51. arquivo.print(cavernas[i].distancia);
  52. arquivo.print(" ");
  53. arquivo.println(cavernas[i].life);
  54. }
  55. }
  56. arquivo.println("");
  57. elementos = 0;
  58. caso ++ ;
  59. }
  60. arquivo.close();
  61. }
  62.  
  63. private void rotina (Caverna[] nos) {
  64. No temp;
  65. No2 temp2;
  66.  
  67. while (heap[0] != null) {
  68. Caverna posicao = heap[0] ;
  69. temp = posicao.adjacencia.inicio ;
  70. temp2 = posicao.dist.inicio ;
  71. posicao.marcado = false ;
  72. remover(heap);
  73.  
  74. while (temp != null) {
  75. int difenca = posicao.life - temp.posicao.perda;
  76. if (temp2.dist + posicao.distancia < temp.posicao.distancia && difenca > 0) {
  77. temp.posicao.distancia = temp2.dist + posicao.distancia ;
  78. temp.posicao.life = posicao.life - temp.posicao.perda ;
  79. if (temp.posicao.marcado == false ) {
  80. inserir(heap,temp.posicao);
  81. temp.posicao.marcado = true ;
  82. }
  83. }
  84. else if (temp2.dist + posicao.distancia == temp.posicao.distancia && difenca > 0) {
  85. if (temp.posicao.life < posicao.life - temp.posicao.perda) {
  86. temp.posicao.life = posicao.life - temp.posicao.perda ;
  87. if (temp.posicao.marcado == false ) {
  88. inserir(heap,temp.posicao);
  89. temp.posicao.marcado = true ;
  90. }
  91. }
  92. }
  93. temp = temp.next ;
  94. temp2 = temp2.next ;
  95. }
  96. }
  97. }
  98.  
  99. public void heap (Caverna[] processos, int tamanho) {
  100.  
  101. for (int i = tamanho/2 -1 ; i >= 0 ; i--) {
  102. heapify (processos,i,tamanho) ;
  103. }
  104. }
  105.  
  106. public void inserir (Caverna[] processos,Caverna processo) {
  107. processos[elementos] = processo ;
  108. heapifyBottomUp (processos,elementos);
  109. elementos = elementos + 1; ;
  110. }
  111.  
  112. public void heapify(Caverna[] processos, int i,int tamanho) {
  113. int maior = 0 ;
  114. if (2*i + 1 < tamanho) {
  115. if (2* i + 2 < tamanho && compareTo(processos[2*i +2],processos[2*i+1]) > 0) {
  116. maior = 2*i + 2 ;
  117. }
  118. else {
  119. maior = 2*i + 1 ;
  120. }
  121. }
  122. if (maior != 0 && compareTo(processos[i],processos[maior])< 0){
  123. troca (processos,i,maior);
  124. heapify(processos,maior,tamanho);
  125. }
  126. }
  127.  
  128. public void remover (Caverna[] processos) {
  129. processos[0] = processos[elementos - 1 ];
  130. processos[elementos -1] = null ;
  131. heapify(processos,0,elementos-1);
  132. elementos = elementos - 1 ;
  133.  
  134. }
  135. public void heapifyBottomUp (Caverna[] processos, int i) {
  136. if (i != 0 && compareTo(processos[i],processos[(i-1)/2]) > 0 ) {
  137. troca(processos,i,(i-1)/2) ;
  138. heapifyBottomUp(processos,(i-1)/2);
  139. }
  140. }
  141. public void troca (Caverna [] processos,int i,int j){
  142. Caverna temp = processos[i] ;
  143. processos[i] = processos[j];
  144. processos[j] = temp ;
  145. }
  146.  
  147. public int compareTo(Caverna c1, Caverna c2) {
  148. int retorno = 0;
  149. if (c1.distancia > c2.distancia) {
  150. retorno = -1 ;
  151. }
  152. else if (c1.distancia == c2.distancia) {
  153. if (c1.life >= c2.life) {
  154. retorno = -1 ;
  155. }
  156. else {
  157. retorno = 1;
  158. }
  159. }
  160. else {
  161. retorno = 1;
  162. }
  163. return retorno;
  164. }
  165.  
  166. public static void main (String [] args) {
  167. new L3QD ();
  168. }
  169. }
  170. //FIM DA CLASSE PRINCIPAL
  171.  
  172. class No {
  173. No next ;
  174. Caverna posicao ;
  175. No (Caverna posicao) {
  176. this.posicao = posicao ;
  177. }
  178.  
  179. }
  180. //FIM DA CLASSE NO
  181.  
  182. class Caverna {
  183. int distancia = Integer.MAX_VALUE ;
  184. int numero ;
  185. int perda = 0;
  186. int life ;
  187. Lista2 dist = new Lista2 () ;
  188. Lista adjacencia = new Lista () ;
  189. boolean marcado = false ;
  190. }
  191. //FIM DA CLASSE CAVERNA
  192.  
  193. class Lista {
  194. No inicio ;
  195. No fim;
  196.  
  197. public void inserir (No no) {
  198. if (inicio == null) {
  199. inicio = no ;
  200. fim = inicio ;
  201. }
  202. else {
  203. fim.next = no ;
  204. fim = fim.next ;
  205. }
  206. }
  207. }
  208. //FIM DA CLASSE LISTA
  209.  
  210. class No2 {
  211. int dist ;
  212. No2 next ;
  213. public No2(int dist) {
  214. this.dist = dist ;
  215. }
  216. }
  217. //FIM DA CLASSE NO2
  218.  
  219. class Lista2 {
  220. No2 inicio ;
  221. No2 fim ;
  222. public void inserir (int no) {
  223. if (inicio == null) {
  224. inicio = new No2(no) ;
  225. fim = inicio;
  226. }
  227. else {
  228. fim.next = new No2(no) ;
  229. fim = fim.next ;
  230. }
  231. }
  232. }
  233. //FIM DA CLASSE LISTA2
  234.  
  235. class Grafo {
  236. Caverna inicio ;
  237. int fim ;
  238. }
  239. //FIM DA CLASSE GRAFO
Add Comment
Please, Sign In to add comment