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");
}
}
}
}