1. 程式人生 > 其它 >pta L1-054 福到了

pta L1-054 福到了

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)\)

,為編號為 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 號客人會吃掉小吃 22 號客人吃掉小吃 34 號客人吃不到喜歡的小吃傷心的離開了,所以答案為 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;
}