求调
查看原帖
求调
541786
yh2022mayu楼主2024/10/24 10:11

不用管时间复杂度洛谷数据不会T,麻烦dalao看一下那WA了QWQ

#define ll long long
int n, m;
ll ans;
vci g[1000005], e[1000005];
int dcc, dfn[1000005], low[1000005], sz[1000005], tot, f[1000005];
stack<int> st;
void tarjan(int u){
	dfn[u] = low[u] = ++tot;
	st.push(u);
	for(int v : g[u]){
		if(!dfn[v]){
			tarjan(v);
			if(dfn[u] <= low[v]){
				dcc++;
				while(1){
					int t = st.top();
					st.pop();
					e[dcc + n].psb(t);
					e[t].psb(dcc + n);
					if(t == v) break;
				}
				e[dcc + n].psb(u);
				e[u].psb(dcc + n);
			}
		}
		else low[u] = min(low[u], dfn[v]);
	}
}
void dfs1(int u, int ft){
	f[u] = ft;
	sz[u] = (u <= n);
	for(int v : e[u])
		if(v != ft){
			dfs1(v, u);
			sz[u] += sz[v];
		}
}
void dfs2(int u, ll cnt){
	for(int v : e[u])
		for(int w : e[v])
			if(w != u){
				if(v != f[u]) dfs2(w, cnt);
				if(w != f[f[u]]) ans += (ll)(cnt - 1 - sz[w]) * sz[w];
				else ans += (ll)(cnt - 1 - (cnt - sz[v])) * (cnt - sz[v]);
			}
}
signed main(){
	srand(time(0));
	cin >> n >> m;
	while(m--){
		int a, b;
		cin >> a >> b;
		g[a].psb(b);
		g[b].psb(a);
	}
	for(int i = 1; i <= n; i++)
		if(!dfn[i]){
			tarjan(i);
			dfs1(i, 0);
			dfs2(i, sz[i]);
		}
	cout << ans;
	return 0;
}
2024/10/24 10:11
加载中...