2 条题解
-
0
核心思路:将坐标转化为数字做并查集
#include <bits/stdc++.h> using namespace std; #define ll long long #define endl '\n' const int N = 1e6 + 5; int n, m, fa[N], sum; inline int findFa(int x) // 并查集:找父节点 { if (fa[x] == x) return x; return fa[x] = findFa(fa[x]); // 记得加记忆化 } bool unite(int x, int y) // 检查两个点是否需要联通 如果需要则做合并 { int xx = findFa(x), yy = findFa(y); if (xx == yy) return false; fa[xx] = yy; return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for (int i = 1; i <= n * m; i++) fa[i] = i; // 初始化并查集 int x1, y1, x2, y2; while (cin >> x1 >> y1 >> x2 >> y2 && x1 && x2 && y1 && y2) unite((x1 - 1) * m + y1, (x2 - 1) * m + y2); // 将坐标转换为数字 for (int i = 1; i < n; i++) // 从第i行枚举到第n-1行 for (int j = 1; j <= m; j++) // 枚举每一列 if (unite((i - 1) * m + j, i * m + j)) // 如果上下两个点没有联通 连通并记录 sum++; for (int i = 1; i <= n; i++) for (int j = 1; j < m; j++) if (unite((i - 1) * m + j, (i - 1) * m + j + 1)) // 同理 枚举左右两个点 sum += 2; cout << sum << endl; }
信息
- ID
- 623
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 52
- 已通过
- 19
- 上传者