蒟蒻45pts只过前9个点后面mle求调
查看原帖
蒟蒻45pts只过前9个点后面mle求调
516722
WSSBWSSWSW楼主2024/10/18 14:41
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int N = 5e5+10; 
const int M = 1e6+10;
int n,m;
namespace st1{
	long long ans;
	int b[N];
	int f[N];
	vector<int> e[N];
	struct node{
		int u,v;
	}uv[N<<1];
	int find(int x){
		return f[x]==x?x:f[x]=find(f[x]);
	}
	void work(int cnt){
		int res = 0;
		for(int i = 1;i<=m;++i){
			bool flag = 1;
			for(int j = 1;j<=n;++j){
				f[j] = j;
			}
			for(int j = 1;j<=m;++j){
				if(j==i)continue;
				int fx = find(uv[j].u),fy = find(uv[j].v);
				if(fx==fy)continue;
				f[fx] = fy;
			}
			for(int j = 2;j<=cnt;++j){
				if(find(b[j])!=find(b[j-1])){
					flag = 0;
					break;
				}
			}
			if(flag)++res;
		}
		ans+=(1ll<<res)%mod;
		ans%=mod;
	}
	void dfs(int now,int cnt){
		if(cnt)work(cnt);
		if(now==n||cnt==n)return ;
		for(int i = now+1;i<=n;++i){
			b[cnt+1]=i;
			dfs(i,cnt+1);
		}
	}
	void solve(){
		for(int i = 1;i<=m;++i){
			int u,v;
			scanf("%d%d",&u,&v);
			uv[i].u = u;
			uv[i].v = v;
			e[u].push_back(v);
			e[v].push_back(u);
		}
		dfs(0,0);
		printf("%lld",ans);
	}
}
namespace st2{
	//bool f1;
	int head[N],nxt[M<<1],to[M<<1],tot = 1;
	int dfn[N],low[N],cnt,sum,vis[N],is[N];
	long long dp[N][2],lg[M];
	vector<int> e[N];
	int siz[N],vis2[N],esz[N];
	//bool f2;
	void add(int x,int y){
		nxt[++tot] = head[x];
		to[tot] = y;
		head[x] = tot;
	}
	void tarjan(int u,int from){
		dfn[u]=low[u] = ++cnt;
		for(int i = head[u];i;i=nxt[i]){
			int v = to[i];
			if(!dfn[v]){
				tarjan(v,i);
				if(low[v]>dfn[u]){
					is[i] = is[i^1] = 1;
				}
				low[u] = min(low[u],low[v]);
			}else if(i!=(1^from)){
				low[u] = min(low[u],dfn[v]);
			}
		}
	}
	void dfs(int u,int id){
		siz[id]++;
		vis[u] = id;
		for(int i = head[u];i;i=nxt[i]){
			int v = to[i];
			if(vis[v]||is[i])continue;
			dfs(v,id);
		}
	}
	void build(int u,int fa){
		vis2[u] = 1;
		for(int i = head[u];i;i=nxt[i]){
			int v=to[i];
			if(vis2[v]){
				continue;
			}
			if(is[i]){
				e[vis[u]].push_back(vis[v]);
			}
			build(v,u);
		}
	}
	void init(){
		lg[0]=1;
		for(int i = 1;i<M;++i){
			lg[i] = lg[i-1]*2%mod;
		}
	}
	void dfs2(int u){
		for(int v:e[u]){
			dfs2(v);
			esz[u]+=esz[v]+1;
		}
	}
	void work(int u){
		dp[u][1]=1;
		for(int v:e[u]){
			work(v);
			dp[u][1]=dp[u][1]*(dp[v][1]+lg[esz[v]+1])%mod;
			dp[u][0]+=dp[v][1]*lg[esz[u]-esz[v]-1]%mod-dp[v][0]*lg[esz[u]-esz[v]]%mod;
			dp[u][0]%=mod;
		}
		dp[u][1]=(dp[u][1]*lg[siz[u]]%mod-lg[esz[u]])%mod;
		dp[u][0]=(dp[u][1]-dp[u][0])%mod;
	}
	void solve(){
		//printf("%.4f\n",(&f1-&f2)/1024.0);
		for(int i = 1;i<=m;++i){
			int u,v;
			scanf("%d%d",&u,&v);
			add(u,v);
			add(v,u);
		} 
		tarjan(1,0);
		for(int i = 1;i<=n;++i){
			if(!vis[i]){
				dfs(i,++sum);
				continue;
			}
		}
		build(1,0);
		init();
		dfs2(1);
		work(1);
		long long ans = (dp[1][0]%mod+mod)%mod;
		ans*=lg[m-sum+1];
		ans%=mod;
		printf("%lld",ans);
	}
}
int main(){
	//freopen("barrack.in","r",stdin);
	//freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	if(n<=16&&m<=25){
		st1::solve();
		//st2::solve(); 
	}else{
		st2::solve(); 
	}
	return 0;
}
2024/10/18 14:41
加载中...