因为有环所以加了检测,结果记忆化不能直接放函数里面了否则会蛙,但这样又会超时...
#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]<<" ";
}
}