2 条题解

  • 0
    @ 2023-1-16 14:33:27

    核心思路:将坐标转化为数字做并查集

    #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
    上传者