鱼C论坛

 找回密码
 立即注册
查看: 2443|回复: 5

并查集问题

[复制链接]
发表于 2021-11-13 20:07:46 | 显示全部楼层 |阅读模式
1鱼币
★问题描述
皮卡丘一共有N只袜子,袜子共有K种颜色(当然一只袜子只有一种颜色)(K<=N)。爱卫生的皮卡丘在连续M天中每天都要穿两只颜色相同的袜子,如果皮卡丘某天拿到了两只颜色不同的袜子,它就会施展魔法改变袜子颜色使得两只袜子变成相同颜色。

现给出皮卡丘在M天内每天要穿的两只袜子的序号,问它最少需要修改几只袜子的颜色才能达到目的。

★数据输入
输入第一行包括三个正整数 N,M,K(2<=N<=200000,0<=M<=200000,1<=K<=200000)。

第二行输入 N 个正整数 C1,C2,C3...CN(1<=Ci<=K),表示每只袜子的颜色。

接下来M行,每行两个正整数 li,ri (1<=li,ri<=N) 表示皮卡丘在M天内每天要穿的袜子序号。

★数据输出
输出一个整数,为皮卡丘需要修改颜色的袜子的最少只数。

★输入示例
3  2  3
1  2  3
1  2
2  3
★输出示例
2

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-13 20:19:21 | 显示全部楼层
你这个文字讲的太难理解了
现给出皮卡丘在M天内每天要穿的两只袜子的序号,问它最少需要修改几只袜子的颜色才能达到目的
每天穿两个袜子不同颜色只要施展魔法变一次就变成相同颜色了?你所说的目的是什么》?是所有的袜子要全部变成一样的目的还是每天变变多少天吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-13 20:45:28 | 显示全部楼层
zy8818 发表于 2021-11-13 20:19
你这个文字讲的太难理解了
现给出皮卡丘在M天内每天要穿的两只袜子的序号,问它最少需要修改几只袜子的颜 ...

就是比如 第一天穿 1 2  第二天穿 1 2 那只要第一天把序号1的袜子颜色改成颜色 2 那第二天就不用改了,只修改了一次
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-14 11:52:04 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-11-14 11:55 编辑

题目看似简单,实则困难:

思路
首先,假设某天袜子颜色不一,必须解决该改变的袜子颜色(2 选 1),如同题目要求,以最少改变次数作答(虽然每次 2 选 1,但该选择哪里一个袜子,最终都会大大影响全局袜子变数)
其二,范本太大,每项少于 200000,如果可以直接以组合公式算还好,但这题目给定每日袜子颜色不定,变数超级大,无论是内存空间,时间复杂度都大大提升

注:一般这种题目,除非数学超级好,否则大佬们都会视而不见,毕竟数学和程序代码是 2 个不同领域的学问
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-16 19:40:09 | 显示全部楼层
  1. #include <bits/stdc++.h>

  2. using namespace std;

  3. const int veryBig=200005;

  4. vector<int> Boss[veryBig];
  5. int Function[veryBig];
  6. int Amazing[veryBig];


  7. int wanting(int Value) {
  8.         if ( Value != Function[Value] )
  9.         {
  10.                 Function[Value] = wanting( Function[Value] );
  11.         }
  12.         return Function[Value];
  13. }

  14. void Unity(int first,int second) {
  15.        
  16.         int A = wanting(first);
  17.         int B = wanting(second);
  18.        
  19.         if (A != B)
  20.         {
  21.                 Function[B] = A;
  22.         }
  23.        
  24. }

  25. void Play()
  26. {
  27.         int Number;
  28.         int Days;
  29.         int Color;
  30.         int Left;
  31.         int Right;
  32.         int total;
  33.        
  34.         cin >> Number >> Days >> Color;
  35.        
  36.         for (int i = 1; i <= Number; i++) {
  37.                 Function[i] = i;
  38.                 cin >> Amazing[i];
  39.         }
  40.         for (int i = 1; i <= Days; i++) {
  41.                 cin >> Left >> Right;
  42.                 Unity(Left,Right);
  43.         }
  44.         for (int i = 1; i <= Number; i++) {
  45.                 Boss[wanting(i)].push_back(Amazing[i]);
  46.         }

  47.         for (int i = 1; i <= Number; i++) {
  48.                
  49.                 int Length;
  50.                 Length = Boss[i].size();
  51.                 int Max;
  52.                 Max = 0;
  53.                
  54.                 if (Length > 1) {
  55.                         map <int,int> sum;
  56.                         for (int j = 0; j<Length; j++) {
  57.                                 sum[Boss[i][j]]++;
  58.                                 Max = max( Max, sum[Boss[i][j]]);
  59.                         }
  60.                         total += ( Length - Max );
  61.                 }
  62.                
  63.                 Boss[i].clear();
  64.                
  65.         }
  66.         cout << total;
  67. }

  68. int main() {
  69.         Play();
  70. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-16 19:40:41 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 16:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表