社区讨论
扩展域并查集求调
题目总版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m2tw50pd
- 此快照首次捕获于
- 2024/10/29 11:31 去年
- 此快照最后确认于
- 2025/11/04 15:46 4 个月前
该题目来自罗勇军《算法竞赛》,洛谷上没有,在vj里有,附上题目链接:Find them, Catch them 。调一上午了,vj和poj里的各种评论都看了,死活找不到问题出在哪,故放在我谷上,求各位大佬帮忙看看。
CPP#include<numeric>
#include<algorithm>
#include<vector>
#include<iostream>
#include<map>
#include<stdio.h>
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
int tt = 1;
struct DSU{
vector<int>fa;
DSU(int n):fa(2*n+1,0) {
for(int i=1;i<=2*n;i++)
fa[i]=i;
}
int find(int x) {
while(x!=fa[x]){
x=fa[x]=fa[fa[x]];
}
return x;
}
void merge(int x, int y) {
x=find(x), y=find(y);
if (x != y){
fa[x] = y;
}
}
bool same(int x, int y) {
return find(x)==find(y);
}
};
void solve() {
int n, m;
n=read(),m=read();
vector<int>vis(n+1,0);
DSU dsu(2*n);
for (int i = 1; i <= m; i++) {
char ch;
cin>>ch;
int a, b;
a=read();
b=read();
if (ch=='D'){
dsu.merge(a, b + n);
dsu.merge(b, a + n);
vis[a]=true;
vis[b]=true;
} else {
if(n==2){
cout<<"In different gangs."<<endl;
}else{
if ((vis[a]==false||vis[b]==false)&&(a!=b)){
cout<<"Not sure yet."<<endl;
}else{
if(dsu.same(a, b)||dsu.same(a+n,b+n)||a==b){
cout<<"In the same gang."<<endl;
}else{
cout<<"In different gangs."<<endl;
}
}
}
}
}
}
signed main(){
tt=read();
while (tt--) {
solve();
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...