求助 tarjan递归调用导致堆栈溢出
查看原帖
求助 tarjan递归调用导致堆栈溢出
397391
jqjiksina楼主2023/2/16 18:33

如题,下述代码中 tarjan 调用时发现有 3000 多层导致堆栈溢出, 是我哪里写错了吗? 调试了半天。。。

#include <bits/stdc++.h>
//缩点
const int maxn = 1e4 + 1;
int n, m;
int head[maxn], tot, wei[maxn];
int dfn[maxn], low[maxn], stac[maxn], top, tim, id[maxn], idn, rid[maxn];		//tarjan用
bool isInstac[maxn];
struct Node
{
	int to, next;
}point[maxn];
void init()
{
	memset(head, 0, sizeof(head));
	memset(point, 0, sizeof(point));
	tot = 0;
}
void add_edge(int x, int y)
{
	int tmp = head[x];
	head[x] = ++tot;
	point[tot].to = y;
	point[tot].next = tmp;
}
void tarjan(int x)
{
	low[x] = dfn[x] = ++tim;
	stac[top++] = x;
	isInstac[x] = true;
	int u;
	for (int i = head[x]; i; i = point[i].next) {
		u = point[i].to;
		if (!dfn[u]) {					//子结点没有被访问过
			tarjan(u);
			low[x] = std::min(low[x], low[u]);
		}
		else if (isInstac[u]) {			//子结点在栈中
			low[x] = dfn[u];
		}
	}
	if (dfn[x] == low[x]) {
		++idn;
		int tmp = 0;
		do {
			u = stac[--top]; stac[top] = 0; isInstac[u] = false;	//出栈
			tmp += wei[u];			//缩点, 将权值聚集起来
			rid[u] = idn;				//保存好该点所在的强连通分量id
			//TO DO: 输出结果
//			std::cout << u << " ";
		} while (u != x);
		wei[x] = tmp;
		rid[x] = idn;
//				std::cout << std::endl;
		id[idn] = x;					//保存好第几个强连通分量的根
	}
}
int dp[maxn];
void dfs(int x)
{
	if (dp[x])
		return;
	dp[x] = wei[x];
	for (int i = head[x]; i; i = point[i].next) {
		dfs(point[i].to);
		dp[x] = std::max(dp[x], dp[point[i].to] + wei[x]);	//记忆化搜索
	}
}
const int maxm = 1e5 + 1;
int x[maxm], y[maxm];
int main()
{
//	freopen("test/P3387_2.in", "r", stdin);
	std::cin >> n >> m;
	for (int i = 1; i <= n; i++)
		std::cin >> wei[i];
	for (int i = 1; i <= m; i++) {
		std::cin >> x[i] >> y[i];
		add_edge(x[i], y[i]);
	}
	for (int i = 1; i <= n; i++)
		if (!dfn[i])
			tarjan(i);
	init();		//清空原图
	for (int i = 1; i <= m; i++) {
		if (rid[x[i]] == rid[y[i]])
			continue;
		add_edge(x[i], y[i]);
	}
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		dfs(i);		
		ans = std::max(ans, dp[i]);
	}
	std::cout << ans << std::endl;		//输出答案

	return 0;
}
2023/2/16 18:33
加载中...