Advertisement
Guest User

Untitled

a guest
Apr 10th, 2011
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.83 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3. import java.math.*;
  4.  
  5. public class Main implements Runnable {
  6.     String file = "template";
  7.     ArrayList<Integer>[] edges;
  8.     boolean[] visited;
  9.     int gID;
  10.  
  11.     int dfs(int cur) {
  12.         visited[cur] = true;
  13.         int n = 1;
  14.         for (int to : edges[cur]) {
  15.             if (!visited[to]) {
  16.                 n += dfs(to);
  17.             }
  18.         }
  19.         return n;
  20.     }
  21.  
  22.     class Province implements Comparable<Province> {
  23.         int size;
  24.         int id;
  25.  
  26.         public Province(int size, int id) {
  27.             this.size = size;
  28.             this.id = id;
  29.         }
  30.  
  31.         @Override
  32.         public int compareTo(Province o) {
  33.             if (size == o.size) {
  34.                 return id - o.id;
  35.             }
  36.             return size - o.size;
  37.         }
  38.  
  39.     }
  40.  
  41.     @SuppressWarnings("unchecked")
  42.     void solve() throws IOException {
  43.         int n = nextInt();
  44.         int m = nextInt();
  45.         int k = nextInt();
  46.         edges = new ArrayList[n];
  47.         for (int i = 0; i < n; ++i) {
  48.             edges[i] = new ArrayList<Integer>();
  49.         }
  50.         visited = new boolean[n];
  51.         for (int i = 0; i < m; ++i) {
  52.             int a = nextInt() - 1;
  53.             int b = nextInt() - 1;
  54.             edges[a].add(b);
  55.             edges[b].add(a);
  56.         }
  57.         TreeSet<Province> comp = new TreeSet<Province>();
  58.         int tot = 0;
  59.         for (int i = 0; i < n; ++i) {
  60.             if (!visited[i]) {
  61.                 int t = dfs(i);
  62.                 comp.add(new Province(t, gID++));
  63.                 tot += Math.min(k, t);
  64.             }
  65.         }
  66.         int ans = 0;
  67.         while (tot < (comp.size() - 1) * 2) {
  68.             Province a = comp.pollFirst();
  69.             Province b = comp.pollFirst();
  70.             tot -= Math.min(k, a.size);
  71.             tot -= Math.min(k, b.size);
  72.             Province s = new Province(a.size + b.size, gID++);
  73.             tot += Math.min(k, s.size);
  74.             comp.add(s);
  75.             ++ans;
  76.         }
  77.         out.println(ans);
  78.  
  79.     }
  80.  
  81.     public static void main(String[] args) {
  82.         new Thread(new Main()).start();
  83.     }
  84.  
  85.     BufferedReader br;
  86.     PrintWriter out;
  87.     StringTokenizer tok;
  88.  
  89.     public void run() {
  90.         try {
  91.             if (Boolean.getBoolean("SpbAU")) {
  92.                 br = new BufferedReader(new FileReader(file + ".in"));
  93.                 out = new PrintWriter(System.out);
  94.             } else {
  95.                 br = new BufferedReader(new InputStreamReader(System.in));
  96.                 out = new PrintWriter(System.out);
  97.             }
  98.             tok = new StringTokenizer("");
  99.             while (hasNext()) {
  100.                 solve();
  101.             }
  102.             out.close();
  103.         } catch (Exception e) {
  104.             e.printStackTrace();
  105.             System.exit(1);
  106.         }
  107.     }
  108.  
  109.     boolean hasNext() throws IOException {
  110.         while (!tok.hasMoreElements()) {
  111.             String line = br.readLine();
  112.             if (line == null) {
  113.                 return false;
  114.             }
  115.             tok = new StringTokenizer(line);
  116.         }
  117.         return true;
  118.     }
  119.  
  120.     String next() throws IOException {
  121.         if (hasNext()) {
  122.             return tok.nextToken();
  123.         }
  124.         System.err.println("Nom more tokens");
  125.         System.exit(1);
  126.         return "";
  127.     }
  128.  
  129.     int nextInt() throws IOException {
  130.         return Integer.parseInt(next());
  131.     }
  132.  
  133.     long nextLong() throws IOException {
  134.         return Long.parseLong(next());
  135.     }
  136.  
  137.     double nextDouble() throws IOException {
  138.         return Double.parseDouble(next());
  139.     }
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement