这里有一个做离散化用的数组,本来下标从1开始。代码如下
#include<bits/stdc++.h>
using namespace std;
const int MaxN = 100005;
struct edge {
int x, y, e;
} input[MaxN + 5];
int a[2 * MaxN + 10], fa[2 * MaxN + 10];
bool cmp (edge e1, edge e2) {
return e1.e > e2.e;
}
int find(int x) {
if(fa[x] == x) return x;
else return fa[x] = find(fa[x]);
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int n;
scanf("%d", &n);
int cnt = -1;
for(int i = 1; i <= n; i++) {
edge _i;
scanf("%d%d%d", &_i.x, &_i.y, &_i.e);
input[i] = _i;
a[++cnt] = _i.x;
a[++cnt] = _i.y;
}
sort(a, a + cnt);
int num = unique(a, a + cnt) - a;
for(int i = 1; i <= n; i++) {
input[i].x = lower_bound(a, a + num, input[i].x) - a;
input[i].y = lower_bound(a, a + num, input[i].y) - a;
}
for(int i = 1; i <= num; i++) fa[i] = i;
sort(input + 1, input + n + 1, cmp);
bool flag = true;
for(int i = 1; i <= n; i++) {
int x = input[i].x, y = input[i].y;
if(input[i].e == 1) {
fa[x] = y;
} else {
if(find(x) == find(y)) {
printf("NO\n");
flag = false;
break;
}
}
}
if(flag) printf("YES\n");
}
return 0;
}
中间的sort也加了1,但是提交结果花花绿绿的。后来我改成下标从0开始,结果居然AC了。我对这种迭代器的使用不够熟悉。求大佬们解释!万分感谢。
AC代码如下
#include<bits/stdc++.h>
using namespace std;
const int MaxN = 100005;
struct edge {
int x, y, e;
} input[MaxN + 5];
int a[2 * MaxN + 10], fa[2 * MaxN + 10];
bool cmp (edge e1, edge e2) {
return e1.e > e2.e;
}
int find(int x) {
if(fa[x] == x) return x;
else return fa[x] = find(fa[x]);
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
memset(fa, 0, sizeof(fa));
memset(a, 0, sizeof(a));
memset(input, 0, sizeof(input));
int n;
scanf("%d", &n);
int cnt = -1;
for(int i = 1; i <= n; i++) {
edge _i;
scanf("%d%d%d", &_i.x, &_i.y, &_i.e);
input[i] = _i;
a[++cnt] = _i.x;
a[++cnt] = _i.y;
}
sort(a, a + cnt);
int num = unique(a, a + cnt) - a;
for(int i = 1; i <= n; i++) {
input[i].x = lower_bound(a, a + num, input[i].x) - a;
input[i].y = lower_bound(a, a + num, input[i].y) - a;
}
for(int i = 1; i <= num; i++) fa[i] = i;
sort(input + 1, input + n + 1, cmp);
bool flag = true;
for(int i = 1; i <= n; i++) {
int x = input[i].x, y = input[i].y;
if(input[i].e == 1) {
fa[find(x)] = find(y);
} else {
if(find(x) == find(y)) {
printf("NO\n");
flag = false;
break;
}
}
}
if(flag) printf("YES\n");
}
return 0;
}