70分求助
查看原帖
70分求助
611273
kalipolis楼主2022/3/8 11:31

因为有环所以加了检测,结果记忆化不能直接放函数里面了否则会蛙,但这样又会超时...

#include <bits/stdc++.h>
using namespace std;
#define N 100000+10
int ding[N];//存最后一条边的编号
int dfs[N];//记忆化
bool aa[N];
struct {
	int to;//终点
	int next;//上一条边编号
}bian[2*N];
int ee = 1;
void add_bian(int a,int b) {
	bian[ee].next = ding[a];
	bian[ee].to = b;
	ding[a] = ee++;
}
int n, m;
int maxs(int father) {
	if (dfs[father] != 0) {
		return dfs[father];
	}
	int s = 0;
	aa[father] = true;
	for (int q = ding[father]; q != 0; q = bian[q].next) {
		if (aa[bian[q].to])continue;
		s = max(s, maxs(bian[q].to));
	}
	aa[father] = false;
	return max(s, father);
}
int main() {
	cin >> n >> m;
	int u, v;
	for (int i = 1; i <= m; i++) {
		cin >> u >> v;
		add_bian(u, v);
	}
	for (int i = 1; i <= n; i++) {
		dfs[i] = maxs(i);
		cout << dfs[i]<<" ";
	}

}
2022/3/8 11:31
加载中...