思维+实现 可以尝试
思路:如果 A 在评论中说 B 是船员,则 A 和 B 属于同一团队(冒名顶替者或船员)。 如果 A 在评论中说 B 是冒名顶替者,则 A 和 B 属于不同的团队。如果 A 和 B 在同一个团队中,那么我们添加权重为 0 的边,否则添加权重为 1。
给出ac代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int f[2*N],size[2*N];
bool st[N];
int find(int x){
if(x==f[x]) return x;
else return f[x]=find(f[x]);
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
f[fy]=fx;
size[fx]+=size[fy];
size[fy]=0;
}
}
int main(){
int tt,x,y;
cin>>tt;
string t;
while(tt--){
int n,m,ans=0;
cin>>n>>m;
memset(st,0,sizeof(st));
for(int i=1;i<=2*n;i++) {f[i]=i;}
for(int i=1;i<=n;i++) size[i]=1;
for(int i=n+1;i<=2*n;i++) size[i]=0;
for(int i=1;i<=m;i++){
cin>>x>>y>>t;
if(t=="imposter") {merge(x,y+n);merge(x+n,y);}
else {merge(x,y);merge(x+n,y+n);}
}
int ff=0;
for(int i=1; i<=n; i++){
if(find(i)==find(i+n)){
if(!ff)cout<<-1<<endl;
ff=1;
}
ans+=max(size[i],size[i+n]);
}
if(!ff)cout<<ans<<endl;
}
return 0;
}
ccpc网络赛搞得心累,孩子想放个假