为毛样例不过但AC了?
查看原帖
为毛样例不过但AC了?
507718
spdarkle楼主2022/12/2 10:28

RT code:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 5000050
#define p 1000000007
int edcc,c[N],dfn[N],low[N],ans,a[N],num,tot=1,cnt,n,m,head[N],nxt[N],ver[N],inv=(p+1)>>1,bridge[N];
int shead[N],snxt[N],sver[N],f[N],stot=1;
void add_s(int u,int v){
	snxt[++stot]=shead[u],sver[shead[u]=stot]=v;	
}
void add(int u,int v){
	nxt[++tot]=head[u],ver[head[u]=tot]=v;
}
void dfs(int u,int fa){
	ans=(ans+f[u])%p;
	for(int i=shead[u];i;i=snxt[i]){
		int v=sver[i];
		if(v!=fa){
			dfs(v,u);
			f[v]=(1ll*f[v]*inv)%p;
			ans=(1ll*ans+1ll*f[u]*f[v]%p)%p;
			f[u]=(1ll*f[u]+1ll*f[v]+1ll*f[u]*f[v]%p)%p;
		}
	}
}
void tarjan(int u,int in){
//	cout<<u<<endl;
	dfn[u]=low[u]=++num;
	for(int i=head[u];i;i=nxt[i]){
		int v=ver[i];
		if(!dfn[v]){
			tarjan(v,i);
			low[u]=min(low[u],low[v]);
			if(dfn[u]<low[v]){
				bridge[i]=bridge[i^1]=1; 
			}
		}
		else if(i!=(in^1))low[u]=min(low[u],dfn[v]);
	}
//	cout<<u<<endl;
} 
void dfs2(int u,int num){
	c[u]=num;
	for(int i=head[u];i;i=nxt[i]){
		if(bridge[i]||c[ver[i]])continue;
		dfs2(ver[i],num);
	}
}
void init_1(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);add(v,u);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
	for(int i=1;i<=n;i++)if(!c[i])dfs2(i,++edcc);
}
void init_2(){
	for(int i=1;i<=edcc;i++)f[i]=1;
	for(int i=1;i<=n;i++)f[c[i]]=1ll*f[c[i]]*2%p;
	for(int i=1;i<=edcc;i++)f[i]--;
	for(int i=2;i<=tot;i+=2){
		int u=ver[i],v=ver[i^1];
		if(c[u]==c[v])continue;
		add_s(c[u],c[v]);
		add_s(c[v],c[u]);
	} 
//	cout<<edcc<<"\n";
	dfs(1,0);
	for(int i=1;i<=m;i++)ans=1ll*ans*2%p;
	cout<<(ans%p+p)%p<<"\n";
}
signed main(){
	ios::sync_with_stdio(false);
//	freopen("barrack4.in","r",stdin);
	init_1();
//	cout<<"AS"<<endl;
	init_2();
}
2022/12/2 10:28
加载中...