import java.io.*;
import java.util.*;
public class mis {
private static Integer[] vertex;
private static HashMap<Integer, Set<Integer>> graph;
private static Set<Integer> ok;
private static LinkedList<Integer> toDelete;
private static int n, m, d;
private static void delete(Integer vert) {
for (int i : graph.get(vert)) {
graph.get(i).remove(vert);
if (graph.get(i).size() < d) {
toDelete.add(vertex[i]);
ok.remove(vertex[i]);
}
}
}
private static void doMagic() {
for (int i = 1; i <=n; i++) {
if (graph.get(i).size() < d) {
toDelete.add(vertex[i]);
} else {
ok.add(vertex[i]);
}
}
while (!toDelete.isEmpty()) {
delete(toDelete.removeFirst());
}
if (ok.isEmpty()) {
System.out.println("NIE");
return;
}
Set<Integer> biggestSet = Collections.emptySet(), currentSet;
while (!ok.isEmpty()) {
Integer curr = ok.iterator().next();
ok.remove(curr);
currentSet = getSubset(curr, new HashSet<Integer>(){{add(curr);}});
if (currentSet.size() > biggestSet.size()) {
biggestSet = currentSet;
}
}
System.out.println(biggestSet.size());
Integer[] arr = new Integer[biggestSet.size()];
biggestSet.toArray(arr);
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
for (Integer i : arr) {
sb.append(i).append(" ");
}
System.out.print(sb.toString());
}
private static HashSet<Integer> getSubset(Integer vertex, HashSet<Integer> hs){
if (graph.get(vertex).isEmpty())
return hs;
hs.addAll(graph.get(vertex));
Set<Integer> tmp = graph.get(vertex);
ok.removeAll(tmp);
graph.put(vertex, Collections.emptySet());
for (Integer i : tmp) {
graph.get(i).remove(vertex);
}
for (Integer i : tmp) {
getSubset(i, hs);
}
return hs;
}
private static void readInput(String[] args) {
BufferedReader br;
try {
br = new BufferedReader(new FileReader(args[0]));
} catch (FileNotFoundException | IndexOutOfBoundsException e) {
br = new BufferedReader(new InputStreamReader(System.in));
}
try {
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
vertex = new Integer[n+1];
graph = new HashMap<>(n);
toDelete = new LinkedList<>();
ok = new HashSet<>(n);
for (int i = 1; i <= n; i++) {
vertex[i] = i;
graph.put(vertex[i], new HashSet<>(n/m));
}
int first, second;
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
first = Integer.parseInt(st.nextToken());
second = Integer.parseInt(st.nextToken());
graph.get(first).add(vertex[second]);
graph.get(second).add(vertex[first]);
}
} catch (IOException ignore) {}
}
public static void main(String[] args) {
readInput(args);
doMagic();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | import java.io.*; import java.util.*; public class mis { private static Integer[] vertex; private static HashMap<Integer, Set<Integer>> graph; private static Set<Integer> ok; private static LinkedList<Integer> toDelete; private static int n, m, d; private static void delete(Integer vert) { for (int i : graph.get(vert)) { graph.get(i).remove(vert); if (graph.get(i).size() < d) { toDelete.add(vertex[i]); ok.remove(vertex[i]); } } } private static void doMagic() { for (int i = 1; i <=n; i++) { if (graph.get(i).size() < d) { toDelete.add(vertex[i]); } else { ok.add(vertex[i]); } } while (!toDelete.isEmpty()) { delete(toDelete.removeFirst()); } if (ok.isEmpty()) { System.out.println("NIE"); return; } Set<Integer> biggestSet = Collections.emptySet(), currentSet; while (!ok.isEmpty()) { Integer curr = ok.iterator().next(); ok.remove(curr); currentSet = getSubset(curr, new HashSet<Integer>(){{add(curr);}}); if (currentSet.size() > biggestSet.size()) { biggestSet = currentSet; } } System.out.println(biggestSet.size()); Integer[] arr = new Integer[biggestSet.size()]; biggestSet.toArray(arr); Arrays.sort(arr); StringBuilder sb = new StringBuilder(); for (Integer i : arr) { sb.append(i).append(" "); } System.out.print(sb.toString()); } private static HashSet<Integer> getSubset(Integer vertex, HashSet<Integer> hs){ if (graph.get(vertex).isEmpty()) return hs; hs.addAll(graph.get(vertex)); Set<Integer> tmp = graph.get(vertex); ok.removeAll(tmp); graph.put(vertex, Collections.emptySet()); for (Integer i : tmp) { graph.get(i).remove(vertex); } for (Integer i : tmp) { getSubset(i, hs); } return hs; } private static void readInput(String[] args) { BufferedReader br; try { br = new BufferedReader(new FileReader(args[0])); } catch (FileNotFoundException | IndexOutOfBoundsException e) { br = new BufferedReader(new InputStreamReader(System.in)); } try { StringTokenizer st = new StringTokenizer(br.readLine()); n = Integer.parseInt(st.nextToken()); m = Integer.parseInt(st.nextToken()); d = Integer.parseInt(st.nextToken()); vertex = new Integer[n+1]; graph = new HashMap<>(n); toDelete = new LinkedList<>(); ok = new HashSet<>(n); for (int i = 1; i <= n; i++) { vertex[i] = i; graph.put(vertex[i], new HashSet<>(n/m)); } int first, second; for (int i = 0; i < m; i++) { st = new StringTokenizer(br.readLine()); first = Integer.parseInt(st.nextToken()); second = Integer.parseInt(st.nextToken()); graph.get(first).add(vertex[second]); graph.get(second).add(vertex[first]); } } catch (IOException ignore) {} } public static void main(String[] args) { readInput(args); doMagic(); } } |
English