大家快来A水题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
(1<= N <=2000)
(1<= M <= N*(N-1)/2)
多组输入。每组第一行输入N,M。接下来M行每行,每行两个整数u,v代表岛u与v之间有一条路。
输出
<span 宋体;="" font-size:="" 14px;="" text-align:="" justify;\"="" style="padding: 0px; margin: 0px;">每组数据输出一个整数,代表部落数。
示例输入
3 1 1 2 3 2 1 2 1 3
示例输出
21
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int f[20020]; int Find(int x)//寻找当前这个岛的对应的源头 { int r = x; while (r != f[r]) r = f[r]; return r; } void Link(int a, int b)//从给出的信息里建立两个岛之间的联系 { int x = Find(a); int y = Find(b); if (x != y) f[x] = y; } int main() { int n, m; while (cin >> n >> m) { for (int i = 1; i <= n; i++)//赋值,将每个到编成对应的编号1--N f[i] = i; for (int i = 1; i <= m; i++) { int a, b; cin >> a >> b; Link(a, b); } int sum = 0; for (int i = 1; i <= n; i++) if (f[i] == i)//不相等的话证明是与其他的岛有相连
//连在一起的的岛中总有一个岛是其原来对应的编号(这个岛叫源头) sum++; cout << sum << endl; } return 0; }