站外题求调
  • 板块灌水区
  • 楼主m1kusama
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/2 22:07
  • 上次更新2023/11/3 06:15:14
查看原帖
站外题求调
538821
m1kusama楼主2023/8/2 22:07

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
struct edge{
	int st,to,v;
}a[520005];
int fa[520005];
int f[500]={1,1};
int n,m;
bool cmp(edge a,edge b){
	return a.v<b.v;
}
bool cmp1(edge a,edge b){
	return a.v>b.v;
}
int find(int x){
	while(x!=fa[x])x=fa[x]=fa[fa[x]];
	return x;
}
int work(){
	int ed=0,ans=0;
	for(int now=1;now<=m;now++){
		int u=find(a[now].st),w=find(a[now].to);
		if(u==w){
			continue;
		} 
		fa[u]=w;
		ed++;
		ans+=a[now].v;
		if(ed==n-1){
			return ans;
		}
	}
}
signed main(){
	int t;
	cin>>t;
	while(t--){
		int s=0;
		cin>>n>>m;
		for(int i=1;i<=n;i++){
			fa[i]=i;
		}
		for(int i=1;i<=m;i++){
			cin>>a[i].st>>a[i].to>>a[i].v;
		}
		sort(a+1,a+m+1,cmp);
		int down=work();
		for(int i=1;i<=n;i++){
			fa[i]=i;
		}
		sort(a+1,a+m+1,cmp1);
		int up=work();
		int i=3;
		while(f[i]<50000){
			f[i]=f[i-1]+f[i-2];
			i++;
		}
		for(int j=1;j<i;j++){
			if(f[j]>=down and f[j]<=up){
				s=1;
			}
		}
		if(s==1) cout<<"YES";
		else cout<<"NO";
		cout<<endl;
	//	cout<<down<<" "<<up<<endl;
	}	
	return 0;
}
2023/8/2 22:07
加载中...