输入输出样例

样例1

输入

  1. 4 5
  2. SCPC
  3. 1 2
  4. 2 3
  5. 3 4
  6. 4 1
  7. 1 3

输出

  1. 4

样例2

输入

  1. 7 10
  2. CCCSSPP
  3. 1 2
  4. 2 3
  5. 3 1
  6. 3 4
  7. 4 5
  8. 5 6
  9. 6 7
  10. 7 4
  11. 2 4
  12. 3 7

输出

  1. 5

题解一:枚举

将三类点分类,枚举四个点,计算这四个点相关的边组成满足题意的子图的数量。能过数据小的测试点。

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. public class Main {
  7. private static boolean[][] map;
  8. private static int ans;
  9. public static void main(String[] args) throws IOException {
  10. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  11. String[] stdin = reader.readLine().split(" ");
  12. final int n = Integer.parseInt(stdin[0]);
  13. final int m = Integer.parseInt(stdin[1]);
  14. List<Integer> cList = new ArrayList<Integer>(n / 2);
  15. List<Integer> sList = new ArrayList<Integer>(n / 4);
  16. List<Integer> pList = new ArrayList<Integer>(n / 4);
  17. String str = reader.readLine();
  18. for (int i = 1; i <= str.length(); ++i) {
  19. switch (str.charAt(i - 1)) {
  20. case 'C':
  21. cList.add(i);
  22. break;
  23. case 'S':
  24. sList.add(i);
  25. break;
  26. case 'P':
  27. pList.add(i);
  28. break;
  29. }
  30. }
  31. map = new boolean[n + 1][n + 1];
  32. int u, v;
  33. for (int i = 0; i < m; ++i) {
  34. stdin = reader.readLine().split(" ");
  35. u = Integer.parseInt(stdin[0]);
  36. v = Integer.parseInt(stdin[1]);
  37. map[u][v] = true;
  38. map[v][u] = true;
  39. }
  40. long start = System.currentTimeMillis();
  41. ans = 0;
  42. for (int i = 0; i < cList.size(); ++i) {
  43. for (int j = i + 1; j < cList.size(); ++j) {
  44. int p1 = cList.get(i);
  45. int p2 = cList.get(j);
  46. for (int p3 : sList) {
  47. for (int p4 : pList) {
  48. count(p1, p2, p3, p4);
  49. count(p1, p2, p4, p3);
  50. count(p1, p3, p4, p2);
  51. count(p2, p3, p4, p1);
  52. }
  53. }
  54. }
  55. }
  56. System.out.println(ans);
  57. System.out.println(System.currentTimeMillis() - start + "ms");
  58. }
  59. private static void count(int p1, int p2, int p3, int p4) {
  60. if (map[p1][p2] && map[p2][p3] && map[p3][p1]) {
  61. if (map[p1][p4]) {
  62. ++ans;
  63. }
  64. if (map[p2][p4]) {
  65. ++ans;
  66. }
  67. if (map[p3][p4]) {
  68. ++ans;
  69. }
  70. }
  71. }
  72. }