pta L1-054 福到了
阿新 • • 發佈:2022-04-18
Cow and Snacks
題面
農場正在舉辦一場派對!
有編號從 1 開始的 n 種小吃,每種小吃只有一份。有 m 個客人會來,每個客人有兩種最喜歡的口味。
農場主可以以某種方式讓客人排隊依次前來
每個客人來到農場時,會把他喜歡的口味的小吃全部吃掉,如果沒有他喜歡的口味,那麼他就會傷心地離開。
請問令客人如何排隊,能使傷心的客人最少?輸出最少的傷心的客人的數量
輸入格式
第一行輸入兩個整數 \(n, m (2 \leq n \leq 10^5, 1 \leq m \leq 10^5)\) ,分別為小吃的數量和客人的數量
接下來 m 行,每行輸入兩個整數 \(x_i, y_i (1 \leq x_i, y_i \leq n, x_i \neq y_i)\)
輸出格式
輸出一個整數,為最少的傷心的客人的數量
輸入樣例
5 4
1 2
4 3
1 4
3 4
輸出樣例1
1
輸入樣例2
6 5
2 3
2 1
3 4
6 5
4 5
輸出樣例2
0
樣例解釋
在第 1 組樣例中,可以讓客人按照 3, 1, 2, 4 的順序排隊,3
號客人會吃掉小吃 1
和小吃 4
, 然後 1
號客人會吃掉小吃 2
,2
號客人吃掉小吃 3
,4
號客人吃不到喜歡的小吃傷心的離開了,所以答案為 1
在第 2 組樣例中,可以按照 2, 1, 3, 5, 4 的順序排隊,沒有客人會傷心
題目解析
並查集,一個聯通塊貢獻了點數-1的答案
#include<bits/stdc++.h> using namespace std; const int N = 1e5+7; int fa[N]; void init(int n) { for(int i = 1 ; i <= n ; i++ ) { fa[i] = i; } } int find(int x) { if(fa[x] == x) return x; return fa[x] = find(fa[x]); } void Union(int u,int v) { int x = find(u); int y = find(v); fa[x] = y; return ; } int main() { ios::sync_with_stdio(0); int n,m; cin >> n >> m; init(n); for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; Union(u, v); } map<int, int>mp; for (int i = 1; i <= n; i++) mp[find(i)]++; int ans = 0; for (auto p : mp)ans += p.second - 1; cout << m - ans << endl; }