Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.*;
- import java.math.*;
- public class Main implements Runnable {
- String file = "template";
- ArrayList<Integer>[] edges;
- boolean[] visited;
- int gID;
- int dfs(int cur) {
- visited[cur] = true;
- int n = 1;
- for (int to : edges[cur]) {
- if (!visited[to]) {
- n += dfs(to);
- }
- }
- return n;
- }
- class Province implements Comparable<Province> {
- int size;
- int id;
- public Province(int size, int id) {
- this.size = size;
- this.id = id;
- }
- @Override
- public int compareTo(Province o) {
- if (size == o.size) {
- return id - o.id;
- }
- return size - o.size;
- }
- }
- @SuppressWarnings("unchecked")
- void solve() throws IOException {
- int n = nextInt();
- int m = nextInt();
- int k = nextInt();
- edges = new ArrayList[n];
- for (int i = 0; i < n; ++i) {
- edges[i] = new ArrayList<Integer>();
- }
- visited = new boolean[n];
- for (int i = 0; i < m; ++i) {
- int a = nextInt() - 1;
- int b = nextInt() - 1;
- edges[a].add(b);
- edges[b].add(a);
- }
- TreeSet<Province> comp = new TreeSet<Province>();
- int tot = 0;
- for (int i = 0; i < n; ++i) {
- if (!visited[i]) {
- int t = dfs(i);
- comp.add(new Province(t, gID++));
- tot += Math.min(k, t);
- }
- }
- int ans = 0;
- while (tot < (comp.size() - 1) * 2) {
- Province a = comp.pollFirst();
- Province b = comp.pollFirst();
- tot -= Math.min(k, a.size);
- tot -= Math.min(k, b.size);
- Province s = new Province(a.size + b.size, gID++);
- tot += Math.min(k, s.size);
- comp.add(s);
- ++ans;
- }
- out.println(ans);
- }
- public static void main(String[] args) {
- new Thread(new Main()).start();
- }
- BufferedReader br;
- PrintWriter out;
- StringTokenizer tok;
- public void run() {
- try {
- if (Boolean.getBoolean("SpbAU")) {
- br = new BufferedReader(new FileReader(file + ".in"));
- out = new PrintWriter(System.out);
- } else {
- br = new BufferedReader(new InputStreamReader(System.in));
- out = new PrintWriter(System.out);
- }
- tok = new StringTokenizer("");
- while (hasNext()) {
- solve();
- }
- out.close();
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- boolean hasNext() throws IOException {
- while (!tok.hasMoreElements()) {
- String line = br.readLine();
- if (line == null) {
- return false;
- }
- tok = new StringTokenizer(line);
- }
- return true;
- }
- String next() throws IOException {
- if (hasNext()) {
- return tok.nextToken();
- }
- System.err.println("Nom more tokens");
- System.exit(1);
- return "";
- }
- int nextInt() throws IOException {
- return Integer.parseInt(next());
- }
- long nextLong() throws IOException {
- return Long.parseLong(next());
- }
- double nextDouble() throws IOException {
- return Double.parseDouble(next());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement