专题链接:https://codeforces.com/group/5yyKg9gx7m/contest/269908/problem/A
思路
先用并查集判断出连通块,后维护每个连通块的最大最小xy,最后比较maxx-minx+maxy-miny的大小即可得出答案
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<cstring>
#include<climits>
#include<vector>
#include<queue>
#include<stack>
#define lowbit(i) ((i)&(-(i)))
#define ll long long
using namespace std;
int root[100001];
int maxx[100001];
int minx[100001];
int maxy[100001];
int miny[100001];
int N,M;
struct note
{
int x;
int y;
}cow[100001];
int find(int x)
{
if (x == root[x])
return x;
return root[x]=find(root[x]);//路径压缩
}
int main()
{
cin >> N >> M;
for (int i = 1; i <= N; i++)
{
scanf("%d%d", &cow[i].x, &cow[i].y);
minx[i] = INT_MAX;//初始化
miny[i] = INT_MAX;
maxx[i] = INT_MIN;
maxy[i] = INT_MIN;
root[i] = i;
}
for (int i = 1; i <= M; i++)//并查集判断连通块
{
int x, y;
scanf("%d%d", &x, &y);
int bl = find(x);
int zn = find(y);
if ( bl!= zn)
{
root[bl] = zn;
}
}
for (int i = 1; i <= N; i++)//更新最大最小值
{
int t = find(i);
minx[t] = min(minx[t],cow[i].x);
maxx[t] = max(maxx[t],cow[i].x);
miny[t] = min(miny[t], cow[i].y);
maxy[t] = max(maxy[t], cow[i].y);
}
int ans = INT_MAX;
for (int i = 1; i <= N; i++)//通过比较差值的大小得出答案
{
if(i==root[i])
ans = min(ans, maxx[i] - minx[i] + maxy[i] - miny[i]);
}
printf("%d\n", 2*ans);
return 0;
}