不是题解!(真的不是)
2025-08-06 13:25:38
发布于:上海
3阅读
0回复
0点赞
#include<iostream>
#include<algorithm>
#include<queue>
int a[200001],tw[200001];
std::vector<int>vec;
int t,n;
struct nude{
int x,y,e;
}data[200001];
bool operator<(nude a,nude b){
return a.e > b.e;
}
int get(int x){
if(a[x]==x)return x;
return a[x] = get(a[x]);
}
void merge(int x,int y){
int fx{get(x)},fy(get(y));
if(fx==fy)return;
if(tw[fx]>tw[fy])a[fy]=fx;
else{
a[fx]=fy;
if(tw[fx]==tw[fy])++tw[fy];
}
}
int mian(...){
vec.clear();
std::cin >> n;
for(int i(0);i<n;++i){
std::cin >> data[i].x >> data[i].y >> data[i].e;
vec.push_back(data[i].x),vec.push_back(data[i].y);
}
std::sort(vec.begin(),vec.end());
vec.erase(std::unique(vec.begin(),vec.end()),vec.end());
for(int i(0);i<n;++i){
data[i].x = std::lower_bound(vec.begin(),vec.end(),data[i].x)-vec.begin();
data[i].y = std::lower_bound(vec.begin(),vec.end(),data[i].y)-vec.begin();
}
std::sort(data,data+n);
for(int i(0);i<vec.size();++i)tw[i]=0,a[i]=i;
for(int i(0);i<n;++i){
if(data[i].e)merge(data[i].x,data[i].y);
else if(get(data[i].x)==get(data[i].y)){
std::cout << "NO\n";
return 0;
}
}
std::cout << "YES\n";
return 0;
}
int main(){
std::cin.tie()->sync_with_stdio(0);
std::cout.tie();
std::cin >> t;
while(t--)mian();
return 0;
}
使用了Kruskal 算法
这里空空如也
有帮助,赞一个