有一个 mm
行 nn
列的点阵,相邻两点可以相连。一条纵向的连线花费一个单位,一条横向的连线花费两个单位。某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。输入格式第一行输入两个正整数 mm
和 nn
。以下若干行每行四个正整数 x1,y1,x2,y2x1,y1,x2,y2
,表示第 x1x1
行第 y1y1
列的点和第 x2x2
行第 y2y2
列的点已经有连线。输入保证|x1−x2|+|y1−y2|=1|x1−x2|+|y1−y2|=1
。输出格式输出使得连通所有点还需要的最小花费。数据范围1≤m,n≤10001≤有一个 mm
行 nn
列的点阵,相邻两点可以相连。一条纵向的连线花费一个单位,一条横向的连线花费两个单位。某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。输入格式第一行输入两个正整数 mm
和 nn
。以下若干行每行四个正整数 x1,y1,x2,y2x1,y1,x2,y2
,表示第 x1x1
行第 y1y1
列的点和第 x2x2
行第 y2y2
列的点已经有连线。输入保证|x1−x2|+|y1−y2|=1|x1−x2|+|y1−y2|=1
。输出格式输出使得连通所有点还需要的最小花费。数据范围1≤m,n≤10001≤m,n≤1000
0≤已经存在的连线数≤100000≤已经存在的连线数≤10000
输入样例:2 2
1 1 2 1
输出样例:3m,n≤1000
0≤已经存在的连线数≤100000≤已经
在的连线数≤10000
输入样例:2 2
1 1 2 1
输出样例:3有一个 mm
行 nn
列的点阵,相邻两点可以相连。一条纵向的连线花费一个单位,一条横向的连线花费两个单位。某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。输入格式第一行输入两个正整数 mm
和 nn
。以下若干行每行四个正整数 x1,y1,x2,y2x1,y1,x2,y2
,表示第 x1x1
行第 y1y1
列的点和第 x2x2
行第 y2y2
列的点已经有连线。输入保证|x1−x2|+|y1−y2|=1|x1−x2|+|y1−y2|=1
。输出格式输出使得连通所有点还需要的最小花费。数据范围1≤m,n≤10001≤m,n≤1000
0≤已经存在的连线数≤100000≤已经存在的连线数≤10000
输入样例:2 2
1 1 2 1
输出样例:3
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010, M = N * N, K = 2 * N * N;
int n, m, k;
int ids[N][N];
int p[M];
struct Edge{
int a, b, w;
}e[K];
int find(int x){
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void get_edge(){
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}, dw[4] = {1, 2, 1, 2};
for (int z = 0; z < 2; z ++)
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
for (int u = 0; u < 4; u ++)
if (u % 2 == z){
int x = i + dx[u], y = j + dy[u], w = dw[u];
if (x && x <= n && y && y <= m){
int a = ids[i][j], b = ids[x][y];
if (a < b) e[k ++] = {a, b, w};
}
}
}
int main(){
cin >> n >> m;
for (int i = 1, t = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++, t ++)
ids[i][j] = t;
for (int i = 1; i <= n * m; i ++) p[i] = i;
int x1, y1, x2, y2;
while(cin >> x1 >> y1 >> x2 >> y2){
int a = ids[x1][y1], b = ids[x2][y2];
p[find(a)] = find(b);
}
get_edge();
int res = 0;
for (int i = 0; i < k; i ++){
int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
if (a != b){
p[a] = b;
res += w;
}
}
cout << res << endl;
return 0;
}