本地测过了,交上去全 T 求助
查看原帖
本地测过了,交上去全 T 求助
637796
Xy_top楼主2023/9/3 17:47
#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, m, k, num;
int ans, cnt, sum;
int b[2000005], dfn[500005], low[500005], P[1000005];
int bel[500005], e[500005], v[500005], sz[500005];
int pre[500005], pre_[500005];
int f[500005][2];
map <pair <int, int>, bool> mp;
const int mod = 1000000007;
struct Node {int u, v, nxt, num;}a[2000005],a_[2000005];
void add (int u, int v) {
	a[++ k] = {u, v, pre[u], num};
	pre[u] = k;
}
void add_ (int u, int v) {
	a_[++ k] = {u, v, pre_[u], num};
	pre_[u] = k;
}
void tarjan (int u, int fe) {
	dfn[u] = low[u] = ++ cnt;
	for (int i = pre[u]; i; i = a[i].nxt) {
		if (a[i].num == fe) continue;
		int v = a[i].v;
		if (!dfn[v]) {
			tarjan (v, a[i].num);
			if (dfn[u] < low[v]) b[a[i].num] = 1;
			low[u] = min (low[u], low[v]);
		} else low[u] = min (low[u], dfn[v]);
	}
}
void dfs (int u, int c) {
	++ v[c];
	bel[u] = c;
	for (int i = pre[u]; i; i = a[i].nxt) {
		int v = a[i].v;
		if (bel[v] || b[a[i].num]) continue;
		dfs (v, c);
	}
}
int predfs (int u, int fa) {
	sz[u] = e[u];
	f[u][0] = P[e[u]];
	f[u][1] = (P[e[u] + v[u] ] - P[e[u] ] + mod) % mod;
	for (int i = pre_[u]; i; i = a_[i].nxt) {
		int v = a_[i].v;
		if (v == fa) continue;
		predfs (v, u);
		sz[u] += sz[v] + 1;
	}
}
void dfs_ans (int u, int fa) {
	for (int i = pre_[u]; i; i = a_[i].nxt) {
		int v = a_[i].v;
		if (v == fa) continue;
		dfs_ans (v, u);
		f[u][1] = (f[u][1] * ((f[v][0] << 1) + f[v][1]) % mod + f[u][0] * f[v][1] % mod) % mod;
		f[u][0] = (f[u][0] * (f[v][0] << 1)) % mod;
	}
	if (u == 1) ans += f[u][1];
	else ans += f[u][1] * P[sz[1] - sz[u] - 1];
	ans %= mod;
}
void solve () {
	P[0] = 1;
	For (i, 1, 1000000) P[i] = P[i - 1] * 2 % mod;
	scanf ("%lld%lld", &n, &m);
	For (i, 1, m) {
		int u, v;
		scanf ("%lld%lld", &u, &v);
		++ num;
		add (u, v);
		add (v, u);
	}
	For (i, 1, n) if (!dfn[i]) tarjan (i, 0);
	For (i, 1, n) if (!bel[i]) dfs (i, ++ sum);
	For (i, 1, k) {
		if (i % 2 == 0) continue;
		if (bel[a[i].u] == bel[a[i].v]) ++ e[bel[a[i].u]];
		else if (!mp[make_pair (bel[a[i].u], bel[a[i].v])]){
			mp[make_pair (bel[a[i].u], bel[a[i].v])] = 1;
			mp[make_pair (bel[a[i].v], bel[a[i].u])] = 1;
			add_(bel[a[i].u],bel[a[i].v]);
			add_(bel[a[i].v],bel[a[i].u]);
		}
	}
	predfs (1, 0);
	dfs_ans (1, 0);
	cout << ans;
}
signed main () {
	ios :: sync_with_stdio (false);
	int _ = 1;
//	cin >> _;
	while (_ --) {
		solve ();
		cout << '\n';
	}
	return 0;
}
2023/9/3 17:47
加载中...