Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 1st, 2012  |  syntax: None  |  size: 3.93 KB  |  hits: 16  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. }