40pts,求调
查看原帖
40pts,求调
540822
HotDogSeller楼主2022/8/19 16:34

救救孩子...... (mp是用于离散化的,cnt是个时间戳)

#include<iostream>
#include<algorithm>
#include<cmath>
#include<memory.h>
#include<map>
#include<vector>
#include<set>
#include<stack>

#define int long long

using namespace std;

int t;
int n,u,v,e,cnt;
int root[2000050];
map<int,int> mp;
stack<pair<int,int> > st;

int f_f(int x){
	if(root[x]!=x){
		root[x]=f_f(root[x]);
	}
	return root[x];
}

void mer(int u,int v){
	root[f_f(u)]=f_f(v);
}

void solve(){
	
	for(int i=1;i<=2000000;i++){
		root[i]=i;
	}
	mp.clear();
	cnt=1;
	
	scanf("%d",&n);
	
	for(int i=1;i<=n;i++){
		cin>>u>>v>>e;
		if(e){
			if(mp[u]==0){
				mp[u]=cnt;
				cnt++;
			}
			if(mp[v]==0){
				mp[v]=cnt;
				cnt++;
			}
			mer(mp[u],mp[v]);
		}else{
			st.push(make_pair(u,v));
		}
	}
	
	while(!st.empty()){
		u=st.top().first;
		v=st.top().second;
		st.pop();
	//	cout<<"("<<mp[u]<<","<<mp[v]<<"):("<<f_f(mp[u])<<","<<f_f(mp[v])<<")"<<endl; 
		if(f_f(mp[u])==f_f(mp[v])){
			cout<<"NO"<<endl;
			return;
		}
	}
	cout<<"YES"<<endl;
	return;
}

signed main(){
	scanf("%d",&t);
	while(t--){
		solve();
	}
	return 0;
}
2022/8/19 16:34
加载中...