日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

4075 染色(并查集)

發布時間:2024/3/26 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4075 染色(并查集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 問題描述:

有 n 個氣球(編號 1~n),其中第 i 個氣球的顏色為 ci。氣球一共有 k 種顏色(編號 1~k),每個氣球的顏色 ci 都滿足 1 ≤ ci ≤ k。接下來要進行 m 次詢問,每次詢問給定兩個整數 l,r,并詢問第 l 個氣球和第 r 個氣球的顏色是否相同。我們希望所有詢問都能得到肯定的回答(即每次詢問的兩個氣球的顏色都相同)。為了達成這一目的,我們可以對其中一些氣球進行重新染色,被重新染色的氣球的顏色也應在 [1,k] 范圍內。為了節約染料,我們希望重新染色的氣球數量盡可能少。請問,最少需要重新染色多少個氣球。注意,所有染色必須在第一次詢問開始之前完成。

輸入格式

第一行包含三個整數 n,m,k。第二行包含 n 個整數 c1,c2,…,cn。接下來 m 行,每行包含兩個整數 l,r。

輸出格式

一個整數,表示最少需要重新染色的氣球數量。

數據范圍

前 5 個測試點滿足,2 ≤ n ≤ 10,0 ≤ m ≤ 5,1 ≤ k ≤ 5。
所有測試點滿足,2 ≤ n ≤ 2 × 10 ^ 5,0 ≤ m ≤ 2 × 10 ^ 5,1 ≤ k ≤ 2 × 10 ^ 5,1 ≤ ci ≤ k,1 ≤ l,r ≤ n,l ≠ r。

輸入樣例1:

3 2 3
1 2 3
1 2
2 3

輸出樣例1:

2

輸入樣例2:

3 2 2
1 1 2
1 2
2 1

輸出樣例2:

0
來源:https://www.acwing.com/problem/content/description/4078/

2. 思路分析:

因為對于每個詢問要求最終的顏色是一樣的所以我們需要將這兩種球的編號放在一個集合中(例如1,2和2,3要求顏色是一樣的那么最終1,2,3顏色最終是一樣的),這樣最終一定會形成若干個集合,每一個集合中的顏色最終是一樣的,集合與集合之間的顏色互不干擾,因為涉及到合并元素到集合中的操作,所以我們可以使用并查集合并元素到一個集合中,對于每一個詢問使用并查集的查找與合并元素的操作將元素合并到一個集合中,然后枚舉編號為1~n的所有氣球,通過并查集的find操作將當前氣球的編號添加到所在的集合中,這樣就會形成若干個集合,因為需要使得重新染色的氣球數量最少,所以我們需要統計出每一個集合中出現顏色最多的次數,將其余的氣球染成這種顏色那么最終所需要染色的氣球數量一定最少的,因為每一個集合的顏色都是相互獨立的所以最終加上每一個集合中需要染色的數量就是答案。

3. 代碼如下:

from typing import Listclass Solution:# 查找x的父節點def find(self, x: int, fa: List[int]):if fa[x] != x: fa[x] = self.find(fa[x], fa)return fa[x]def process(self):n, m, k = map(int, input().split())col = [0] + list(map(int, input().split()))N = 3 * 10 ** 5fa = [i for i in range(N)]for i in range(m):l, r = map(int, input().split())a, b = self.find(l, fa), self.find(r, fa)fa[a] = bS = [list() for i in range(n + 10)]for i in range(1, n + 1):# 將每一個節點合并到對應的集合中方便后面操作S[self.find(i, fa)].append(i)res = 0for i in range(1, n + 1):if S[i]:# count用來計算當前集合中每一種氣球顏色出現的次數count = dict()t = 0for x in S[i]:if col[x] not in count:count[col[x]] = 1else:count[col[x]] += 1# 更新當前出現次數最多的顏色對應的出現次數t = max(t, count[col[x]])# 將其余氣球染成當前的顏色res += len(S[i]) - treturn resif __name__ == '__main__':print(Solution().process())

總結

以上是生活随笔為你收集整理的4075 染色(并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。