社区讨论

求调,第一次做蓝题

P3469[POI 2008] BLO-Blockade参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m63mkn1u
此快照首次捕获于
2025/01/19 21:00
去年
此快照最后确认于
2025/11/04 11:16
4 个月前
查看原帖
CPP
#include<cstdio>
#include<algorithm>

using namespace std;

const int maxn = 5000000;
struct Edge {
	int u, v, next;
} e[maxn << 1];

int len, head[maxn];
void insert(int u, int v) {
	e[++len] = {u, v, head[u]};
	head[u] = len;
}

int n, m;
void input() {
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= m; ++i) {
		int u, v;
		scanf("%d %d", &u, &v);
		insert(u, v);
		insert(v, u);
	}
}

int low[maxn], dfn[maxn], time;
int size[maxn], ans[maxn];
void Tarjan(int u) {
	int sum = 0;
	size[u] = 1;
	low[u] = dfn[u] = ++time;
	for (int i = head[u]; i; i = e[i].next) {
		int v = e[i].v;
		if (dfn[v] == 0) {
			Tarjan(v);
			size[u] += size[v];
			if (low[v] >= dfn[u]) {
				ans[u] += size[v] * sum;
				sum += size[v];
			}
			low[u] = min(low[u], low[v]);
		} else {
			low[u] = min(low[u], dfn[v]);
		}
	}
	ans[u] += n - 1;
	ans[u] += (n - sum - 1) * sum;
}

int main() {
	input();
	for (int i = 1; i <= n; ++i) {
		if (dfn[i] == 0) {
			Tarjan(i);
		}
	}
	for (int i = 1; i <= n; ++i) {
		printf("%d\n", ans[i] * 2);
	}
	return 0;
}
BLO

回复

1 条回复,欢迎继续交流。

正在加载回复...