缩点拓扑序DP乱搞,求Debug(现没写判环,望好心人帮个忙)
查看原帖
缩点拓扑序DP乱搞,求Debug(现没写判环,望好心人帮个忙)
371524
ElmPoplar楼主2022/11/24 11:04
#include <bits/stdc++.h>
using namespace std;
const int N = 100005, M = 100005;
long long ans = 0;

struct Edge {
	int to, next, w;
} g1[M << 1], g2[M << 1];

int n, k, cnt1 = 0, cnt2 = 0, head[N], head2[N], in[N];

void add1(int u, int v, int w) {
	g1[++ cnt1].next = head[u];
	g1[cnt1].to = v;
	g1[cnt1].w = w;
	head[u] = cnt1;
}

void add2(int u, int v, int w) {
	in[v] ++;
	g2[++ cnt2].next = head2[u];
	g2[cnt2].to = v;
	g2[cnt2].w = w;
	head2[u] = cnt2;
}

int tot = 0, col = 0, dfn[N], low[N], color[N], sum[N];
bool insta[N];
stack<int> sta;

void tarjan(int u) {
	dfn[u] = low[u] = ++ tot;
	sta.push(u), insta[u] = 1;

	for (int i = head[u]; i; i = g1[i].next) {
		int v = g1[i].to;

		if (! dfn[v]) {
			tarjan(v);
			low[u] = min(low[u], low[v]);
		} else if (insta[v])
			low[u] = min(low[u], dfn[v]);
	}

	if (dfn[u] == low[u]) {
		color[u] = ++ col;
		while (sta.top() != u) {
			color[sta.top()] = col;
			insta[sta.top()] = 0;
			sum[col] ++;
			sta.pop();
		}
		insta[u] = 0;
		sum[col] ++;
		sta.pop();
	}
}

int f[N];

void topsort() {
	queue<int> q;
	for (int i = 1; i <= col; i ++)
		if (! in[i])
			q.push(i);

	while (! q.empty()) {
		int t = q.front(); q.pop();
		for (int i = head2[t]; i; i = g2[i].next) {
			int v = g2[i].to, w = g2[i].w;
			-- in[v]; f[v] = max(f[v], f[t] + w);
			if (! in[v])
				q.push(v);
		}
	}
}

int main() {
	scanf("%d%d", &n, &k);
	for (int i = 1; i <= n; i ++) {
		int x, a, b;
		scanf("%d%d%d", &x, &a, &b);

		switch (x) {
			case 1: add1(a, b, 0), add1(b, a, 0); break;
			case 3: add1(b, a, 0); break;
			case 5: add1(a, b, 0); break;
		}
	}

	// 0(n+1)节点
	for (int i = 1; i <= n; i ++)
		add1(n + 1, i, 0);

	tarjan(n + 1);

	for (int i = 1; i <= n + 1; i ++)
		for (int j = head[i]; j; j = g1[j].next)
			if (color[i] != color[g1[j].to])
				add2(color[i], color[g1[j].to], g1[j].w);

    topsort();

	for (int i = 1; i <= col; i ++) ans += (long long) f[i] * sum[i];

	printf("%lld\n", ans);

	return 0;
}
2022/11/24 11:04
加载中...