记录编号 549851 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016]犯罪团伙 最终得分 100
用户昵称 GravatarZooxTark➲ 是否通过 通过
代码语言 C++ 运行时间 0.117 s
提交时间 2020-02-25 16:03:26 内存使用 17.48 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. bool Enemy[2001][2001];
  8. class UnionFindSet
  9. {
  10. private:
  11. int MainSet[2001];
  12. int Maxn;
  13. int FindRoot(int Number)
  14. {
  15. return MainSet[Number] = ((MainSet[Number] == Number)? Number : FindRoot(MainSet[Number]));
  16. }
  17. public:
  18. void Reset(int Number)
  19. {
  20. Maxn = Number;
  21. memset(MainSet,-1,sizeof(MainSet));
  22. memset(Enemy,false,sizeof(Enemy));
  23. for(int i = 0;i <= Number;i++)
  24. {
  25. MainSet[i] = i;
  26. }
  27. }
  28. void Union(int num1,int num2,char text)
  29. {
  30. if(text == 'F')
  31. MainSet[FindRoot(num1)] = MainSet[FindRoot(num2)];
  32. else
  33. {
  34. Enemy[num1][num2] = Enemy[num2][num1] = true;
  35. for(int i = 0;i < Maxn;i++)
  36. if(Enemy[num1][i])
  37. MainSet[FindRoot(i)] = MainSet[FindRoot(num2)];
  38. for(int i = 0;i < Maxn;i++)
  39. if(Enemy[num2][i])
  40. MainSet[FindRoot(i)] = MainSet[FindRoot(num1)];
  41. }
  42. }
  43. int CountSet()
  44. {
  45. bool vis[2001];
  46. memset(vis,false,2001);
  47. int Count = 0;
  48. for(int i = 1;i <= Maxn;i++)
  49. {
  50. int iTemp = FindRoot(i);
  51. if(!vis[iTemp])
  52. {
  53. Count++;
  54. vis[iTemp] = true;
  55. }
  56. }
  57. return Count;
  58. }
  59. };
  60.  
  61. int main()
  62. {
  63. ifstream fin("crime.in");
  64. ofstream fout("crime.out");
  65. int n,m;
  66. fin >> n >> m;
  67. char c;
  68. int a,b;
  69. UnionFindSet UFS;
  70. UFS.Reset(n);
  71. for(int i = 0;i < m;i++)
  72. {
  73. fin >> c >> a >> b;
  74. UFS.Union(a,b,c);
  75. }
  76. fout << UFS.CountSet();
  77. return 0;
  78. }