1. 程式人生 > 其它 >LuoguP2097 資料分發1 題解

LuoguP2097 資料分發1 題解

LuoguP2097 資料分發1 題解

Content

有一些電腦,一部分電腦有雙向資料線連線。如果一個電腦得到資料,它可以傳送到的電腦都可以得到資料。現在,你有這個資料,問你至少將其輸入幾臺電腦,才能使所有電腦得到資料。

資料範圍:\(n\leqslant 10^5,m\leqslant 2\times 10^5\)

Solution

稍微觀察以後就會明白這是一道經典的並查集題目,我們只需要通過並查集將兩個電腦所在的聯通快合併,最後看有多少個聯通塊就好了。

Code

int f[100007], n, m, vis[100007], ans;

inline int getfa(int x) {
	return x == f[x] ? x : f[x] = getfa(f[x]);
}
inline void unionn(int x, int y) {
	x = getfa(x), y = getfa(y);
	if(x != y) f[y] = x;
}

int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++i) f[i] = i;
	for(int i = 1; i <= m; ++i) {
		int a, b;
		scanf("%d%d", &a, &b);
		unionn(a, b);
	}
	for(int i = 1; i <= n; ++i) if(!vis[getfa(i)]) ans++, vis[getfa(i)] = 1;
	printf("%d", ans);
	return 0;
}