Guest User

Untitled

a guest
Jul 21st, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.25 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.StringTokenizer;
  3. import java.util.LinkedList;
  4. import java.util.Vector;
  5.  
  6. public class bugs {
  7.  
  8. static class Matrix{
  9. int matrix[][];
  10. int size;
  11.  
  12. int xy[], yx[];
  13. boolean vx[], vy[];
  14. int mr[], mc[];
  15. int answer;
  16.  
  17. Matrix(){
  18. size=0;
  19. }
  20.  
  21. private int min(int a, int b){
  22. if (a<b)
  23. return a;
  24. else
  25. return b;
  26. }
  27. private int max(int a, int b){
  28. if (a>b)
  29. return a;
  30. else
  31. return b;
  32. }
  33.  
  34. public void loadGraph()throws IOException{
  35. BufferedReader in;
  36. StringTokenizer st;
  37. in=new BufferedReader(new FileReader("assignment.in"));
  38. String temp=in.readLine();
  39. st=new StringTokenizer(temp);
  40. size=Integer.parseInt(st.nextToken());
  41. matrix=new int[size][size];
  42. for (int i=0; i<size; i++){
  43. temp=in.readLine();
  44. st=new StringTokenizer(temp);
  45. for (int j=0; j<size; j++){
  46. matrix[i][j]=Integer.parseInt(st.nextToken());
  47. }
  48. }
  49. in.close();
  50. }
  51.  
  52. boolean findOus(int i){
  53. if (vx[i])
  54. return false;
  55. vx[i]=true;
  56. for (int j=0; j<size; j++)
  57. if (matrix[i][j]-mr[i]-mc[j]==0)
  58. vy[j]=true;
  59. for (int j=0; j<size; j++)
  60. if ((matrix[i][j]-mr[i]-mc[j]==0) && yx[j]==-1) {
  61. xy[i]=j;
  62. yx[j]=i;
  63. return true;
  64. }
  65. for (int j=0; j<size; j++)
  66. if ((matrix[i][j]-mr[i]-mc[j]==0) && findOus(yx[j])) {
  67. xy[i] = j;
  68. yx[j] = i;
  69. return true;
  70. }
  71. return false;
  72. }
  73.  
  74. void kuhn(){
  75. xy=new int[size];
  76. yx=new int[size];
  77. vx=new boolean[size];
  78. vy=new boolean[size];
  79. mr=new int[size];
  80. mc=new int[size];
  81. for (int i=0; i<size; i++){
  82. mc[i]=Integer.MAX_VALUE;
  83. mr[i]=Integer.MAX_VALUE;
  84. xy[i]=-1;
  85. yx[i]=-1;
  86. vx[i]=false;
  87. vy[i]=false;
  88. }
  89. for (int i=0; i<size; ++i)
  90. for (int j=0; j<size; ++j)
  91. mr[i]=min(mr[i],matrix[i][j]);
  92. for (int j=0; j<size; ++j)
  93. for (int i=0; i<size; ++i)
  94. mc[j]=min(mc[j], matrix[i][j]-mr[i]);
  95. int counter=0;
  96. while (counter<size){
  97. int k=0;
  98. for (int i=0; i<size; ++i)
  99. if ((xy[i]==-1) && findOus(i))
  100. ++k;
  101. counter+=k;
  102. if (k==0) {
  103. //////////////////
  104. int z=Integer.MAX_VALUE;
  105. for (int i=0; i<size; ++i){
  106. if (vx[i])
  107. for (int j=0; j<size; ++j){
  108. if (!vy[j])
  109. z=min(z, matrix[i][j]-mr[i]-mc[j]);
  110. }
  111. }
  112. for (int i=0; i<size; ++i) {
  113. if (vx[i]){
  114. mr[i]+=z;
  115. }
  116. if (vy[i]){
  117. mc[i]-=z;
  118. }
  119. ///////////////////
  120. }
  121. }
  122. }
  123.  
  124. answer=0;
  125. for (int i=0; i<size; ++i){
  126. answer+=matrix[i][xy[i]];
  127.  
  128. }
  129. }
  130.  
  131.  
  132. public void print()throws IOException{
  133. PrintWriter out;
  134. out=new PrintWriter(new FileWriter("assignment.out"));
  135. kuhn();
  136. out.print(answer+"\n");
  137. for (int i=0; i<size; ++i){
  138. out.print((i+1)+" "+(xy[i]+1));
  139. if (i!=size-1)
  140. out.print("\n");
  141. }
  142. out.flush();
  143. out.close();
  144. }
  145. }
  146.  
  147.  
  148. /////////////////////////////////////////////////////////////
  149. /////////////////////////////////////////////////////////////
  150.  
  151. public static void main(String[] arg)throws IOException{
  152. Matrix g=new bugs.Matrix();
  153. g.loadGraph();
  154. g.print();
  155. }
  156. }
Add Comment
Please, Sign In to add comment