This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 1e5 + 9;
int n, m;
vector<int> g[N];
// bridge tree (WA for subtask 89)
namespace subtask34567 {
int num[N], low[N], tme;
int lab[N], cnt_scc, sz[N];
int path[N], top;
void tarjan(int u, int p) {
num[u] = low[u] = ++tme;
path[++top] = u;
for (int v : g[u]) if (v != p) {
if (num[v]) low[u] = min(low[u], num[v]);
else {
tarjan(v, u);
low[u] = min(low[u], low[v]);
}
}
if (num[u] == low[u]) { // chot
++cnt_scc;
int v;
do {
v = path[top--];
num[v] = low[v] = N;
lab[v] = cnt_scc;
++sz[cnt_scc];
} while (v != u);
}
}
vector<int> g2[N];
void init_graph() {
for (int u = 1; u <= n; ++u) for (int v : g[u])
if (lab[u] != lab[v]) g2[lab[u]].push_back(lab[v]);
}
ll ans, dp[N][3];
bool vis[N];
void dfs(int u, int p) {
vis[u] = true;
dp[u][1] = sz[u];
dp[u][2] = (ll)(sz[u] - 1) * (sz[u] - 1);
ans += (ll)sz[u] * (sz[u] - 1) * (sz[u] - 2);
for (int v : g2[u]) if (v != p) {
dfs(v, u);
ans += dp[u][1] * dp[v][2] * 2;
ans += dp[u][2] * dp[v][1] * 2;
dp[u][1] += dp[v][1];
dp[u][2] += dp[v][2];
dp[u][2] += dp[v][1] * sz[u];
}
}
void solve() {
for (int i = 1; i <= n; ++i)
if (!num[i]) tarjan(i, 0);
init_graph();
for (int u = 1; u <= cnt_scc; ++u)
if (!vis[u]) dfs(u, 0);
cout << ans << '\n';
}
}
bool f[N];
int main() {
cin.tie(NULL)->sync_with_stdio(false);
cin >> n >> m;
for (int i = 0, u, v; i < m; ++i) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
subtask34567::solve();
}
/** /\_/\
* (= ._.)
* / >0 \>1
**/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |