求助,T了#2,#9,#10
查看原帖
求助,T了#2,#9,#10
632236
gan1234楼主2023/3/8 13:09
#include<bits/stdc++.h>
#define MAXN 500005
#define mod 998244353
#define P pair<int,int>
#define int long long
using namespace std;
vector<int>G[1000005];
int vis[MAXN],p[MAXN],dep[MAXN];
int g[MAXN],f[MAXN];
map<P,int>ma;
int n,m,T;
int flg;
int book(int x,int y){
	return ma[P(x,y)]||ma[P(y,x)];
}
void findcut(int x,int y){
	if(book(x,y)){
		flg=1;
		return ;
	}
	ma[P(x,y)]=1;
	//cout<<x<<" "<<y<<endl;
	while(x!=y){
		if(dep[x]<=dep[y])swap(x,y);
		if(book(x,p[x])){
			flg=1;
			return ;
		}
		ma[P(x,p[x])]=1;
		//cout<<x<<" "<<p[x]<<endl;
		x=p[x];
	}
}
void dfs(int x,int pre){
	p[x]=pre;dep[x]=dep[pre]+1;
	int l=G[x].size();
	for(int i=0;l>i;i++){
		if(flg==1)return ;
		int y=G[x][i];
		if(y==pre)continue;
		//cout<<x<<"-"<<y<<endl;
		if(book(x,y))continue;
		if(vis[y]){
			findcut(x,y);
			continue;
		}else{
			vis[y]=1;
			dfs(y,x);
		}
	}
}
void dfs2(int x,int pre){
	vis[x]=1;
	int l=G[x].size();
	int tt=0;
	f[x]=1;
	for(int i=0;l>i;i++){
		int y=G[x][i];
		if(book(x,y)||y==pre)continue;
		dfs2(y,x);
		f[x]=(f[x]*f[y])%mod;
		tt++;
	}
	f[x]=(f[x]*g[tt-(pre==0)+1])%mod;
}
void init(){
	flg=0;
	ma.clear();
	memset(vis,0,sizeof(vis));
	for(int i=1;n>=i;i++)G[i].clear();
	cin>>n>>m;
	int x,y;
	for(int i=0;m>i;i++){
		cin>>x>>y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void solve(){
	init();
	if(m>2*n-2){
	    cout<<0<<endl;
	    return ;
	}
	vis[1]=1;
	dfs(1,0);
	if(flg==1){
		cout<<0<<endl;
		return ;
	}
	memset(vis,0,sizeof(vis));
	int ans=1;
	for(int i=1;n>=i;i++){
		if(!vis[i]){
			dfs2(i,0);
			ans=(ans*f[i])%mod;
		}
	}
	cout<<ans<<endl;
}
signed main(){
    ios::sync_with_stdio(0);
	g[0]=g[1]=1;
	for(int i=2;MAXN-4>=i;i++)g[i]=(g[i-1]+(i-1)*g[i-2]%mod)%mod;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
2023/3/8 13:09
加载中...