题目
题解
对于样例我们很容易分析到对于一个点来讲ans[i]=t*(n-t-1) t=size[i],即为他的解
CODE
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 100;
typedef long long ull;
typedef pair <int, int > pii;
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); }
while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
return s * w;
}
int n, m, num_edge = 0, tim = 0;
struct Edge { int next, to; } edge[maxn];
int head[maxn], low[maxn], dfn[maxn], size[maxn];
ull ans[maxn];
inline void add(int from, int to) {
edge[++num_edge].to = to;
edge[num_edge].next = head[from];
head[from] = num_edge;
}
void dfs(int u) {
ull sum = 0;
size[u] = 1;
dfn[u] = low[u] = ++tim;
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].to;
if (!dfn[v]) {
dfs(v);
size[u] += size[v];
low[u] = min(low[u], low[v]);
if (low[v] >= dfn[u]) {
ans[u] += sum * size[v];
sum += size[v];
}
}
else low[u] = min(low[u], dfn[v]);
}
ans[u] += sum * (n - sum - 1);
}
int main() {
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
n = read(), m = read();
for (int i = 1; i <= m; ++i) {
int a, b;
a = read(); b = read();
add(a, b);
add(b, a);
}
dfs(1);
for (int i = 1; i <= n; ++i) {
printf("%lld\n", (ans[i] + n - 1) << 1);
}
// system("PAUSE");
return 0;
}