dfs60分,请问哪里有问题
  • 板块P3916 图的遍历
  • 楼主wh_up
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/6 19:04
  • 上次更新2024/4/6 20:55:31
查看原帖
dfs60分,请问哪里有问题
983436
wh_up楼主2024/4/6 19:04

这个代码没有书上讲的那个出现环时没有更新的问题,但是还是有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;
 } 
2024/4/6 19:04
加载中...