#include <bits/stdc++.h>
using namespace std;
int m, n;
struct edge{
int dis;
int from, to;
}edges[4000010];
int ufs[1000010];
int tto(int x, int y){
return n * (x - 1) + y;
}
int fd(int x){
if(x != ufs[x])
ufs[x] = fd(ufs[x]);
return ufs[x];
}
void un(int fa, int son){
fa = fd(fa);
son = fd(son);
ufs[son] = fa;
}
int set_edge(){
int len = 0;
for(int i = 1; i < m; ++i){
for(int j = 1; j <= n; ++j){
int p1 = tto(i, j), p2 = tto(i + 1, j);
edges[++len].dis = 1;
edges[len].from = p1;
edges[len].to = p2;
edges[++len].dis = 1;
edges[len].to = p1;
edges[len].from = p2;
}
}
for(int i = 1; i <= m; ++i){
for(int j = 1; j < n; ++j){
int p1 = tto(i, j), p2 = tto(i, j + 1);
edges[++len].dis = 2;
edges[len].from = p1;
edges[len].to = p2;
edges[++len].dis = 2;
edges[len].to = p1;
edges[len].from = p2;
}
}
return len;
}
void show(int len){
for(int i = 1; i <= len; ++i){
//cout << edges[i].from << ' ' << edges[i].to << ' ' << edges[i].dis << endl;
printf("%d %d %d\n", edges[i].from, edges[i].to, edges[i].dis);
}
}
int main(){
//freopen("grid7.in", "r", stdin);
//freopen("out.txt", "w", stdout);
scanf("%d%d", &m, &n);
int x1, y1, x2, y2;
int len, ans = 0;
for(int i = 1; i <= m * n + 1; ++i)
ufs[i] = i;
while(scanf("%d%d%d%d", &x1, &y1, &x2, &y2) == 4){
int p1 = tto(x1, y1), p2 = tto(x2, y2);
//cout << p1 << ' ' << p2 << endl << endl;
un(p1, p2);
}
len = set_edge();
//show(len);
for(int i = 1; i <= len; ++i){
if(fd(edges[i].from) == fd(edges[i].to))
continue;
else{
ans += edges[i].dis;
un(edges[i].from, edges[i].to);
}
}
printf("%d", ans);
return 0;
}
共 2 条回复
cpp后面有换行符 代码后面有换行符
代码框(c++)
```cpp
(写代码)```
效果