求助关于性质5,6(玄关
查看原帖
求助关于性质5,6(玄关
235901
Always_Remember_It楼主2024/11/25 22:09
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int fa[N],x[N],y[N],in[N];
char v[N];
bool vis[N];
void dfs(int s){
	if(fa[s]<=0){
		vis[s]=1;
		return;
	}
	if(vis[s]){
		if(fa[fa[s]]<=0) fa[s]=fa[fa[s]];
		else fa[s]=0;
		return;
	}
	vis[s]=1;
	dfs(fa[s]);
	fa[s]=fa[fa[s]];
	return;
}
signed main(){
	//freopen("tribool3.in","r",stdin);
	//freopen("tribool3.out","w",stdout);
	int c,t;cin>>c>>t;
	while(t--){
		if(c==5||c==6){
			int n,m;cin>>n>>m;
			for(int i=0;i<N;i++){
				x[i]=y[i]=0;
				fa[i]=i;
				in[i]=vis[i]=0;
			}
			for(int i=1;i<=m;i++){
				cin>>v[i];
				if(v[i]=='+') cin>>x[i]>>y[i];
				else cin>>x[i];
			}
			for(int i=1;i<=m;i++){
				if(v[i]=='+'){
					if(fa[x[i]]==fa[y[i]]) continue;
					if(fa[x[i]]!=x[i]&&fa[x[i]]!=-1) --in[fa[x[i]]];
					fa[x[i]]=fa[y[i]];
					++in[fa[y[i]]];
				}
				else fa[x[i]]=-1;
			}
			int cnt=0;
			for(int i=1;i<=n;i++){
				//cout<<in[i]<<" ";
				if(vis[i]||in[i]>0) continue;//此处
				dfs(i);
			}
			//cout<<endl;
			for(int i=1;i<=n;i++){
			    //if(!vis[i]) while(1);
				if(fa[i]==-1) ++cnt;
			}
			cout<<cnt<<endl;
			continue;
		}
	}
	return 0;
}
以上标记处的in[i]>0去掉就能过但是留着就过不了,如果是指向U的连通块肯定有入度为0的点啊,还是说我的入度这么写不对
2024/11/25 22:09
加载中...