Guest User

Untitled

a guest
Jul 15th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.10 KB | None | 0 0
  1. class No {
  2. No next ;
  3. Caverna posicao ;
  4. No (Caverna posicao) {
  5. this.posicao = posicao ;
  6. }
  7.  
  8. }
  9. class Caverna {
  10. int distancia = Integer.MAX_VALUE ;
  11. Lista2 dist = new Lista2 () ;
  12. int numero ;
  13. int pontosPerdidos = 0;
  14. int pontosVida ;
  15.  
  16. Lista adj = new Lista () ;
  17. boolean marcado = false ;
  18. }
  19. class Lista {
  20. No inicio ;
  21. No fim;
  22.  
  23. public void inserir (No no) {
  24. if (inicio == null) {
  25. inicio = no ;
  26. fim = inicio ;
  27. }
  28. else {
  29. fim.next = no ;
  30. fim = fim.next ;
  31. }
  32. }
  33. }
  34. class No2 {
  35. int dist ;
  36. No2 next ;
  37. public No2(int dist) {
  38. this.dist = dist ;
  39. }
  40.  
  41.  
  42. }
  43. class Lista2 {
  44. No2 inicio ;
  45. No2 fim ;
  46. public void inserir (int no) {
  47. if (inicio == null) {
  48. inicio = new No2(no) ;
  49. fim = inicio;
  50. }
  51. else {
  52. fim.next = new No2(no) ;
  53. fim = fim.next ;
  54. }
  55. }
  56. }
  57. class Grafo {
  58. Caverna inicio ;
  59. int fim ;
  60. }
  61.  
  62.  
  63. public class L3QD {
  64. Arquivo arq = new Arquivo("L3QD.in","L3QD.out");
  65. int numeroElementos = 0 ;
  66. Caverna[] heap ;
  67. int contador = 1 ;
  68. StringBuffer buffer ;
  69. String nl;
  70. boolean [] calculado ;
  71. public L3QD () {
  72. while (!arq.isEndOfFile()) {
  73. buffer = new StringBuffer();
  74. buffer.append("Caso #");
  75. buffer.append(contador);
  76. nl = System.getProperty("line.separator");
  77. buffer.append(nl);
  78. numeroElementos = 0;
  79. int n = arq.readInt () ;
  80. int m = arq.readInt();
  81. int l = arq.readInt();
  82. int t = arq.readInt();
  83. Caverna[] cavernas = new Caverna[n];
  84.  
  85.  
  86. for (int i = 0 ; i < m ; i++) {
  87. int ini = arq.readInt();
  88. if (cavernas[ini] == null) {
  89. cavernas[ini] = new Caverna();
  90. cavernas[ini].numero = ini ;
  91. }
  92. int sai = arq.readInt();
  93. if (cavernas[sai] == null) {
  94. cavernas[sai] = new Caverna ();
  95. cavernas[sai].numero = sai ;
  96. }
  97. cavernas[ini].adj.inserir(new No(cavernas[sai]));
  98. cavernas[sai].adj.inserir(new No(cavernas[ini]));
  99. int y = arq.readInt();
  100. cavernas[ini].dist.inserir(y);
  101. cavernas[sai].dist.inserir(y);
  102. }
  103. for (int i = 0; i < t; i++) {
  104. int cav = arq.readInt();
  105. int p = arq.readInt();
  106. cavernas[cav].pontosPerdidos += p ;
  107. }
  108. heap = new Caverna[n];
  109. cavernas[0].distancia = 0 ;
  110. inserir(heap,cavernas[0]);
  111. cavernas[0].pontosVida = l - cavernas[0].pontosVida ;
  112. algoritmo(cavernas);
  113. for (int i = 0; i < n; i++) {
  114. if (cavernas[i].pontosVida <= 0 || cavernas[i].distancia == Integer.MAX_VALUE ) {
  115. buffer.append("Morte certa");
  116. buffer.append(nl);
  117. }
  118. else {
  119. buffer.append(cavernas[i].distancia);
  120. buffer.append(" ");
  121. buffer.append(cavernas[i].pontosVida);
  122. buffer.append(nl);
  123. }
  124. }
  125. arq.print(buffer.toString());
  126. contador ++ ;
  127. }
  128. arq.close();
  129. }
  130.  
  131. private void algoritmo (Caverna[] nos) {
  132.  
  133. No temp;
  134. No2 dist;
  135. while (heap[0] != null) {
  136. Caverna posicao = heap[0] ;
  137. temp = posicao.adj.inicio ;
  138. dist = posicao.dist.inicio ;
  139. posicao.marcado = false ;
  140. remocao(heap);
  141. while (temp != null) {
  142. if (dist.dist + posicao.distancia < temp.posicao.distancia) {
  143. temp.posicao.distancia = dist.dist + posicao.distancia ;
  144. temp.posicao.pontosVida = posicao.pontosVida - temp.posicao.pontosPerdidos ;
  145. if (temp.posicao.marcado == false) {
  146. inserir(heap,temp.posicao);
  147. temp.posicao.marcado = true ;
  148. }
  149. }
  150. else if (dist.dist + posicao.distancia == temp.posicao.distancia) {
  151. if (temp.posicao.pontosVida < posicao.pontosVida - temp.posicao.pontosPerdidos) {
  152. temp.posicao.pontosVida = posicao.pontosVida - temp.posicao.pontosPerdidos ;
  153. }
  154. }
  155. temp = temp.next ;
  156. dist = dist.next ;
  157. }
  158. }
  159. }
  160.  
  161. public void construirHeap (Caverna[] processos, int tam) {
  162.  
  163. for (int i = tam/2 -1 ; i >= 0 ; i--) {
  164. heapify (processos,i,tam) ;
  165. }
  166. }
  167. public void heapify(Caverna[] processos, int i,int tam) {
  168. int maior = 0 ;
  169. if (2*i + 1 < tam) {
  170. if (2* i + 2 < tam && compareTo(processos[2*i +2],processos[2*i+1]) > 0) {
  171. maior = 2*i + 2 ;
  172. }
  173. else {
  174. maior = 2*i + 1 ;
  175. }
  176. }
  177. if (maior != 0 && compareTo(processos[i],processos[maior])< 0){
  178. swap (processos,i,maior);
  179. heapify(processos,maior,tam);
  180. }
  181. }
  182.  
  183. public void remocao (Caverna[] processos) {
  184. processos[0] = processos[numeroElementos - 1 ];
  185. processos[numeroElementos -1] = null ;
  186. heapify(processos,0,numeroElementos-1);
  187. numeroElementos -- ;
  188.  
  189. }
  190. public void inserir (Caverna[] processos,Caverna processo) {
  191. processos[numeroElementos] = processo ;
  192. heapifySubindo (processos,numeroElementos);
  193. numeroElementos ++ ;
  194. }
  195. public void heapifySubindo (Caverna[] processos, int i) {
  196. if (i != 0 && compareTo(processos[i],processos[(i-1)/2]) > 0 ) {
  197. swap(processos,i,(i-1)/2) ;
  198. heapifySubindo(processos,(i-1)/2);
  199. }
  200. }
  201. public void swap (Caverna [] processos,int i,int j){
  202. Caverna temp = processos[i] ;
  203. processos[i] = processos[j];
  204. processos[j] = temp ;
  205. }
  206.  
  207. public int compareTo(Caverna a, Caverna b) {
  208. if (a.distancia >= b.distancia) {
  209. return -1 ;
  210. }
  211. else {
  212. return 1 ;
  213. }
  214. }
  215.  
  216. public static void main (String [] args) {
  217. new L3QD ();
  218. }
  219. }
Add Comment
Please, Sign In to add comment