我刚做这道题时没有初始化:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#define pritnf printf
using namespace std;
const int N = 1005;
int n;
int x[N], y[N];
int f[N];
int cnt = 1;
int ans;
int findf(int k) {
return f[k] == 0 ? k : f[k] = findf(f[k]);
}
int dis(int x1, int y1, int x2, int y2) {
return (abs(x1 - x2) + abs(y1 - y2) + 1) / 2;
}
int dis2(int i1, int j1, int i2, int j2) {
return (abs(x[i1] - x[i2]) + abs(y[j1] - y[j2]) + 1) / 2;
}
priority_queue<pair<int, pair<int, int> > > q;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &x[i], &y[i]);
}
for (int i = 1; i <= n; i++)
for (int j = 1; j < i; j++)
q.push(make_pair(-dis(x[i], y[i], x[j], y[j]), make_pair(i, j)));
while (cnt < n ) {
ans = q.top().first;
int tx = q.top().second.first;
int ty = q.top().second.second;
int xx = findf(tx);
int yy = findf(ty);
if (xx != yy) f[xx] = yy, cnt++;
q.pop();
}
pritnf("%d", ans);
return 0;
}
0分 但我把并查集初始化后
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#define pritnf printf
using namespace std;
const int N = 1005;
int n;
int x[N], y[N];
int f[N];
int cnt = 1;
int ans;
int findf(int k) {
return f[k] == k ? k : f[k] = findf(f[k]);
}
int dis(int x1, int y1, int x2, int y2) {
return (abs(x1 - x2) + abs(y1 - y2) + 1) / 2;
}
priority_queue<pair<int, pair<int, int> > > q;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &x[i], &y[i]);
f[i] = i;//把并查集初始化为i
}
for (int i = 1; i <= n; i++)
for (int j = 1; j < i; j++)
q.push(make_pair(-dis(x[i], y[i], x[j], y[j]), make_pair(i, j)));
while (cnt < n ) {
ans = q.top().first;
int xx = findf(q.top().second.second);
int yy = findf(q.top().second.first);
if (xx != yy) f[xx] = yy, cnt++;
q.pop();
}
pritnf("%d", -ans);
return 0;
}
怎么就A了呢? 求大佬解答!!