这个代码没有书上讲的那个出现环时没有更新的问题,但是还是有WA。大佬们帮忙看看。
#include<cstdio>
#include<vector>
using namespace std;
int n, m, A[100001], tag[100001];
vector<int> v[100001];
int dfs(int k) // 求结点k可以达到的最大节点数
{
int i, ma=-1, now;
for(i =0;i<v[k].size();i++){
if( !tag[v[k][i]] ){ // 结点未访问过--直接递归
tag[v[k][i]] = 1;
now = dfs(v[k][i]); // 下一个节点可以达到的最大结点
if(now > ma) ma = now;
}else{ // 如果结点已经访问过,注意要判断该结点是否可以通往更大的结点编号!! 这个处理很重要!
// ma = A[v[k][i]] > ma ? A[v[k][i]] : ma;
if(A[v[k][i]] > A[k]) A[k] = A[v[k][i]];
}
}
// 对所有的可到结点递归调用完之后,可以得到自己和所有结点可以达到的最大结点值,与当前A[i]进行比较即可!
return A[k] = ma > A[k] ? ma : A[k];
}
int main(void)
{
int i, a, b;
scanf("%d %d", &n, &m);
for(i = 1; i<= n; i++) A[i] = i; // 初始状态为i点能够达到的最大编号就是本身
for(i=0;i<m;i++){
scanf("%d %d", &a, &b);
v[a].push_back(b);
}
for(i=1;i<=n;i++) dfs(i);
for(i=1;i<=n;i++)
printf("%d ", A[i]);
return 0;
}