Guest User

Untitled

a guest
May 1st, 2012
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.PrintWriter;
  3. import java.util.*;
  4.  
  5. public class Main {
  6. static class edge {
  7. int a;
  8. int b;
  9. edge(int a, int b) {
  10. this.a = a;
  11. this.b = b;
  12. }
  13. }
  14.  
  15. static class way {
  16. int i;
  17. LinkedList<Integer> w = new LinkedList<Integer>();
  18.  
  19. way(int i) {
  20. this.i = i;
  21. }
  22. }
  23.  
  24. static class DisjointSets {
  25. static Random rnd = new Random();
  26. int[] p;
  27. int size;
  28.  
  29.  
  30. void init() {
  31. for (int i = 0; i < p.length; i++) {
  32. p[i] = i;
  33. }
  34. }
  35.  
  36. DisjointSets(int size) {
  37. p = new int[size];
  38. this.size = size;
  39. init();
  40. }
  41.  
  42. void copy(DisjointSets A)
  43. {
  44. for (int i = 0; i < size; ++i)
  45. p[i] = A.p[i];
  46. }
  47.  
  48. int root(int x) {
  49. if (p[x] != x) {
  50. p[x] = root(p[x]);
  51. }
  52. return p[x];
  53. }
  54.  
  55. void unite(int a, int b) {
  56. a = root(a);
  57. b = root(b);
  58. if (rnd.nextBoolean()) {
  59. p[a] = b;
  60. } else {
  61. p[b] = a;
  62. }
  63. }
  64. }
  65.  
  66. static boolean checkA(int a, int b, DisjointSets ds) {
  67. if (ds.root(a) == ds.root(b))
  68. return false;
  69. return true;
  70. }
  71.  
  72. public static void main(String args[]) {
  73. try {
  74. Scanner in = new Scanner(new File("multispan.in"));
  75. PrintWriter out = new PrintWriter(new File("multispan.out"));
  76. int m, n;
  77. n = in.nextInt();
  78. m = in.nextInt();
  79. int a, b;
  80. int[] I = new int[m+1];
  81. edge[] edges = new edge[m];
  82. for (int i = 0; i < m; ++i) {
  83. a = in.nextInt() - 1;
  84. b = in.nextInt() - 1;
  85. edges[i] = new edge(a, b);
  86. }
  87. int k = 1;
  88. int size = 0;
  89. while (true) {
  90. if (k*(n-1) == size){
  91. k++;
  92. }
  93. LinkedList<Integer> []Ij = new LinkedList[k+1];
  94. int []A = new int[m];
  95. for (int i = 0; i <= k; ++i){
  96. Ij[i] = new LinkedList<Integer>();
  97. }
  98. for (int i = 0; i < m; ++i)
  99. {
  100. Ij[I[i]].add(i);
  101. }
  102. for (int j = 1; j<=k; ++j){
  103. DisjointSets ds = new DisjointSets(n);
  104. for (Integer i : Ij[j]){
  105. ds.unite(edges[i].a, edges[i].b);
  106. }
  107. for (int i = 0; i < m; ++i){
  108. if (checkA(edges[i].a, edges[i].b, ds)){
  109. A[i] = j;
  110. }
  111. }
  112. }
  113. boolean add = false;
  114. for (int i = 0; i < m; ++i){
  115. if ((A[i] != 0) && (I[i] == 0)){
  116. I[i] = A[i];
  117. add = true;
  118. size++;
  119. break;
  120. }
  121. }
  122. if (add){
  123. continue;
  124. }
  125.  
  126. Queue<way> bfs = new LinkedList<way>();
  127. boolean[] bfc = new boolean[m];
  128.  
  129. for (int i = 0; i < m; ++i) {
  130. if (A[i] != 0) {
  131. way d = new way(i);
  132. d.w.add(i);
  133. bfs.add(d);
  134. bfc[i] = true;
  135. }
  136. }
  137.  
  138. way p = new way(-1);
  139. boolean end = false;
  140. while (!bfs.isEmpty()) {
  141. p = bfs.poll();
  142. if (I[p.i] == 0){
  143. end = true;
  144. break;
  145. }
  146. DisjointSets ds = new DisjointSets(n);
  147. for (Integer j : Ij[I[p.i]]){
  148. if (j != p.i){
  149. ds.unite(edges[j].a, edges[j].b);
  150. }
  151. }
  152. for (int i =0; i < m; ++i){
  153. if (!bfc[i]){
  154. if (checkA(edges[i].a, edges[i].b, ds)){
  155. way d = new way(i);
  156. d.w = (LinkedList<Integer>) p.w.clone();
  157. d.w.add(i);
  158. bfs.add(d);
  159. bfc[i] = true;
  160. }
  161. }
  162. }
  163. }
  164. if (!end)
  165. break;
  166. int first = p.w.pollFirst();
  167. int newPos = I[first];
  168. I[first] = A[first];
  169. for (Integer i : p.w) {
  170. first = I[i];
  171. I[i] = newPos;
  172. newPos = first;
  173. }
  174. size++;
  175. }
  176.  
  177. LinkedList<Integer> []Ij = new LinkedList[k+1];
  178. for (int i = 0; i <= k; ++i){
  179. Ij[i] = new LinkedList<Integer>();
  180. }
  181. for (int i = 0; i < m; ++i)
  182. {
  183. Ij[I[i]].add(i);
  184. }
  185. if (k*(n-1) != size){
  186. k--;
  187. }
  188. out.println(k);
  189. for (int j = 1; j <= k; j++){
  190. for (Integer i : Ij[j]) {
  191. out.print((i + 1) + " ");
  192. }
  193. out.println();
  194. }
  195. out.close();
  196. } catch (Exception e) {
  197. System.out.print(e);
  198. }
  199. }
  200. }
Advertisement
Add Comment
Please, Sign In to add comment