萌新大眼萌妹求助并查集基础题。。。
查看原帖
萌新大眼萌妹求助并查集基础题。。。
310773
PCCP楼主2023/7/26 16:01

RT,尽管我不是妹子,但是这道题是真的简单,WA on #24,感觉没有问题了,特来求助谷内大佬。

代码如下:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<set>
#include<vector>
#include<map>
using namespace std;
typedef pair<int,int> PII;
const int N=2e5+10;
const int M=4e5+10;
int n,m,c,q,fa[N],siz[N];
int he[N],ne[M<<1],to[M<<1],tot=1;
map<int,vector<int> > pos[N];
set<int> mp[N];
inline void addedge(int x,int y){
	to[++tot]=y;
	ne[tot]=he[x];
	he[x]=tot;
}
inline int find(int x){
	if(fa[x]==x){
		return x;
	}
	return fa[x]=find(fa[x]);
}
inline void unify(int x,int y){
	int fx=find(x),fy=find(y);
	if(fx==fy){
		return;
	}
	if(siz[fx]<siz[fy]){
		swap(fx,fy);
	}
	fa[fy]=fx;
	siz[fx]+=siz[fy];
	set<int>::iterator it;
	for(it=mp[fy].begin();it!=mp[fy].end();it++){
		mp[fx].insert(*it);
	}
}
int main(){
	scanf("%d%d%d%d",&n,&m,&c,&q);
	for(int i=1;i<=n;i++){
		fa[i]=i;
		siz[i]=1;
	}
	int x,y,z;
	char op;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		addedge(x,y);
		addedge(y,x);
		mp[find(x)].insert(y);
		mp[find(y)].insert(x);
		pos[x][z].push_back(y);
		unify(y,pos[x][z][0]);
		pos[y][z].push_back(x);
		unify(x,pos[y][z][0]);
	}
	while(q--){
		cin>>op;
		if(op!='?'&&op!='+'){
			cin>>op;
		}
		if(op=='+'){
			scanf("%d%d%d",&x,&y,&z);
			addedge(x,y);
			addedge(y,x);
			mp[find(x)].insert(y);
			mp[find(y)].insert(x);
			pos[x][z].push_back(y);
			unify(y,pos[x][z][0]);
			pos[y][z].push_back(x);
			unify(x,pos[y][z][0]);
		}
		else{
			scanf("%d%d",&x,&y);
			if(mp[find(x)].count(y)||find(x)==find(y)){
				mp[y].insert(find(x));
				printf("Yes\n");
			}
			else{
				printf("No\n");
			}
		}
	}
}
2023/7/26 16:01
加载中...