1 条题解

  • 2
    @ 2025-6-17 10:34:28

    对于每个连通块统计方案数然后成起来。如果一个连通块边比点还多那一定会有冲突,所以只能是基环树或者树。

    其中基环树有两种方案(互为反图)

    树有 nn 种方案,因为每个点都可以作为根,然后从根往下连。

    #include<bits/stdc++.h>
    #define int long long
    #define N 100005
    #define mod 1000000007
    using namespace std;
    int n,m;
    int degree[N];
    int head[N],ver[N<<1],nxt[N<<1],idx=-1;
    void add(int x,int y){
    	++idx;
    	ver[idx]=y,nxt[idx]=head[x],head[x]=idx;
    }
    int cn,cm;
    bool vis[N];
    void dfs(int u){
    	vis[u]=1;
    	cm+=degree[u];
    	for(int i=head[u];~i;i=nxt[i]){
    		int v=ver[i];
    		if(vis[v]){
    			continue;
    		}
    		++cn;
    		dfs(v);
    	}
    }
    signed main(){
    	memset(head,-1,sizeof head);
    	cin>>n>>m;
    	for(int i=1,x,y;i<=m;++i){
    		cin>>x>>y;
    		add(x,y),add(y,x);
    		++degree[x],++degree[y];
    	}
    	int ans=1;
    	for(int i=1;i<=n;++i){
    		if(!vis[i]){
    			cn=1,cm=0;
    			dfs(i);cm>>=1;
    			if(cn==cm){
    				ans=ans*2%mod;	
    			}else if(cn==cm+1){
    				ans=ans*cn%mod;
    			}else{
    				cout<<"0\n";return 0;
    			}
    		}		
    	}cout<<ans<<"\n";
    	return 0;
    }
    
    • 1

    信息

    ID
    256
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    13
    已通过
    8
    上传者