30pts求助呜呜呜 样例2跑出来是0 QAQ
查看原帖
30pts求助呜呜呜 样例2跑出来是0 QAQ
1037550
lucas_s楼主2023/8/17 22:14
#include<bits/stdc++.h>
using namespace std;

const int N=5e4+1;
const int K=1e5+1;

int n,k;
int ans;//统计有多少假话 
int op,x,y;//话的类型 第一只 第二只 
bool isTrue;
int king[N];//每只动物所在食物链的最高者 

void check1(int x,int y){
	if(x>n || y>n) {
		ans++;
		isTrue=false;
	}
}

void check2(int x,int y){
	if(x>n || y>n) {
		ans++;
		isTrue =false;
	}
	if(x==y){
		if(isTrue) ans++;
		isTrue =false;
	}
}

int find(int x){
	return king[x]==x?x:king[x]=find(king[x]);
}

void isReasonable(int x,int y){
	if(x!=y){
		int rx = find(x);
		int ry = find(y);
		if(rx==ry) isTrue=false;
	}
}

void Union(int x,int y){
	int rx = find(x);
	int ry = find(y);
	king[ry]=rx;
}

int main(){
	freopen("02.txt","r",stdin);
	scanf("%d%d",&n,&k);
	
	for(int i=1;i<=n;i++) king[i]=i;
	
	for(int i=1;i<=k;i++){
		scanf("%d%d%d",&op,&x,&y);
		isTrue=true;
		
		if(op==1){
			check1(x,y);
			if(!isTrue) continue;
			isReasonable(x,y);
			if(!isTrue) ans++;
		}
		
		if(op==2){
			check2(x,y);
			if(!isTrue) continue;
			Union(x,y);
		}
	}
	
	printf("%d",ans);
}

2023/8/17 22:14
加载中...