一些疑问 为什么两个代码一个100一个50
查看原帖
一些疑问 为什么两个代码一个100一个50
1121087
czy032321054楼主2025/1/15 11:03

100pts:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int t,n,a[maxn],b[maxn],c[maxn];
map<int,int>mp;
//x[i]!=x[i+n]
int find(int x){
	if(mp[x]==0)mp[x]=x;
	if(mp[x]==x)return x;
	else return mp[x]=find(mp[x]);
}
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		mp.clear();
		bool check=1;
		for(int i=1;i<=n;i++)
			scanf("%d%d%d",&a[i],&b[i],&c[i]);
		for(int i=1;i<=n;i++)
			if(c[i]==1)
				mp[find(a[i])]=find(b[i]);
		for(int i=1;i<=n;i++)
			if(c[i]==0)
				if(find(a[i])==find(b[i])){
					check=0;
					break;
				}
		if(check==1)
			cout<<"YES\n";
		else
			cout<<"NO\n";
	}
}

50pts::

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int t,n,a[maxn],b[maxn],c[maxn];
map<int,int>mp;
const int p=1e9+5;
//x[i]!=x[i+n]
int find(int x){
	if(mp[x]==0)mp[x]=x;
	if(mp[x]==x)return x;
	else return mp[x]=find(mp[x]);
}
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		mp.clear();
		bool check=1;
		for(int i=1;i<=n;i++)
			scanf("%d%d%d",&a[i],&b[i],&c[i]);
		for(int i=1;i<=n;i++){
			if(c[i]==1){
				mp[find(a[i])]=find(b[i]);
			}else if(c[i]==0){
				mp[find(a[i])]=find(b[i]+p);
				mp[find(b[i])]=find(a[i]+p);
			}
			if(find(a[i])==find(a[i]+p)||find(b[i])==find(b[i]+p)){
				check=0;
				break;
			}
		}
		if(check==1)
			cout<<"YES\n";
		else
			cout<<"NO\n";
	}
}
2025/1/15 11:03
加载中...