CodeForces 731C Socks 并查集

Bertha 。 2023-10-11 09:36 90阅读 0赞
  1. 1 //题意:有n只袜子,m天,k个颜色,每个袜子有一个颜色,再给出m天,每天有两只袜子,每只袜子可能不同颜色,
  2. 2 //问要让每天的袜子是相同颜色的,要重新染色的袜子数最少是多少。
  3. 3 //
  4. 4 //这里要注意一点,就是他是一次处理完,之后不会继续染色。这就意味着像
  5. 5 //4 3 2
  6. 6 //1 1 2 2
  7. 7 //1 2
  8. 8 //2 3
  9. 9 //3 4
  10. 10 //这样的一组数据他只能把全部袜子染色成1或者2;而不能第一天穿1 1,第二天就把前一天穿的2号袜子染色成2
  11. 11 //所以也就是说如果这样的一组相互联系起来的袜子它们必须染色成一样的
  12. 12 //故下面的思路也得到了证明
  13. 13 //
  14. 14 //思路:并查集合并,将同一天的袜子合并起来,然后就形成了cnt(就是一个变量)个集合,每个集合都是独立的,因此排序,
  15. 15 //找出每个集合里面袜子颜色相同的最多的是哪个颜色,然后把其他不属于这个颜色的都染成这个颜色。
  16. 16 //那么这样重新染色的袜子数是最少的,然后每个集合的答案加起来就是最后的结果了。
  17. 17 #include<stdio.h>
  18. 18 #include<string.h>
  19. 19 #include<iostream>
  20. 20 #include<algorithm>
  21. 21 #include<vector>
  22. 22 using namespace std;
  23. 23 const int maxn=200010;
  24. 24 int v[maxn],w[maxn],root[maxn],vis[maxn];
  25. 25 vector<int>r[maxn];
  26. 26 int finds(int x)
  27. 27 {
  28. 28 if(x!=v[x])
  29. 29 {
  30. 30 int y=finds(v[x]);
  31. 31 v[x]=y;
  32. 32 return y;
  33. 33 }
  34. 34 return x;
  35. 35 }
  36. 36 void unite(int x,int y)
  37. 37 {
  38. 38 int fx=finds(x);
  39. 39 int fy=finds(y);
  40. 40 if(fx==fy) return ;
  41. 41 v[fx]=fy;
  42. 42 }
  43. 43 int main()
  44. 44 {
  45. 45 int n,m,k;
  46. 46 scanf("%d%d%d",&n,&m,&k);
  47. 47 for(int i=1;i<=n;++i)
  48. 48 {
  49. 49 v[i]=i;
  50. 50 scanf("%d",&w[i]);
  51. 51 }
  52. 52 while(m--)
  53. 53 {
  54. 54 int x,y;
  55. 55 scanf("%d%d",&x,&y);
  56. 56 vis[x]=vis[y]=1;
  57. 57 unite(x,y);
  58. 58 }
  59. 59 int cnt=0;
  60. 60 for(int i=1;i<=n;++i)
  61. 61 {
  62. 62 if(vis[i])
  63. 63 {
  64. 64 if(v[i]==i) root[++cnt]=i;
  65. 65 r[finds(i)].push_back(w[i]);
  66. 66 }
  67. 67 }
  68. 68 int ans=0;
  69. 69 for(int i=1;i<=cnt;++i)
  70. 70 sort(r[root[i]].begin(),r[root[i]].end());
  71. 71 for(int i=1;i<=cnt;++i)
  72. 72 {
  73. 73 int now=1,tmp=0;
  74. 74 for(int j=1;j<r[root[i]].size();j++)
  75. 75 {
  76. 76 if(r[root[i]][j]!=r[root[i]][j-1])
  77. 77 {
  78. 78 tmp=max(tmp,now);
  79. 79 now=1;
  80. 80 }
  81. 81 else now++;
  82. 82 }
  83. 83 tmp=max(now,tmp);
  84. 84 ans+=r[root[i]].size()-tmp;
  85. 85 }
  86. 86 printf("%d\n",ans);
  87. 87 return 0;
  88. 88 }

转载于:https://www.cnblogs.com/kongbursi-2292702937/p/11508277.html

发表评论

表情:
评论列表 (有 0 条评论,90人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CodeForces 731C Socks

    1 //题意:有n只袜子,m天,k个颜色,每个袜子有一个颜色,再给出m天,每天有两只袜子,每只袜子可能不同颜色, 2 //问要让每天的袜子是相同颜色的,要重新

    相关

    这个文章是几年前水acm的时候转的, 当时也不知道作者是谁, 要是有人知道的话说一下吧 并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的

    相关

    > 题目 > 某学校近期要组织全校同学出去参加某项活动,由于人数众多,学校决定让同学们自行组队,以小组为单位进行活动。假设学校一共n个同学,每个同学有一个唯一的数字作为标签

    相关

    森林: 森林是由若干棵互不相交的树组成,两棵树分别独立,没有交集 ![20181112082744488.png][] 并查集: 并查集的结构和森林十分相似,是

    相关

    来看一个实例,[杭电1232畅通工程][1232] 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性