小埋学习图之图的遍历 全WA求助

题目描述

小埋最近在学习有向图的遍历相关知识,小埋学习过图的遍历的相关方法,可以使用 DFS 或者 BFS 来遍历整个有向图,但是小埋发现这个问题有一些不一样,这个图的遍历是问你当前点能够到达的点的最大编号,小埋希望你能帮她解决这个问题。

输入格式

第一行两个整数 n 和 m,n 代表有向图中有 n 个点,m 代表有向图中有 m 条有向边。
接下来是 m 条边。

输出格式

输出每个点能够到达的最大编号

样例

Input 1

4 3 1 2 1 3 2 3

Output 1

3 3 3 4

样例解释

样例1解释:
从1开始,可以到达的最大编号是3;
从2开始,可以到达的最大编号是3;
从3开始,可以到达的最大编号是3;
从4开始,可以到达的最大编号是4。

数据范围

数据范围:1<=n,m<=100000

思路:广搜+反向建图

#include<bits/stdc++.h>
using namespace std;
int n,m,u,v,rem;
vector<int> a[100005];
bool vis[100005];
int ans[100005];
void print(){
  for(int i=1;i<=n;i++) printf("%d ",ans[i]);
  return;
}
void bfs(int x){
  if(ans[x]==0){
    ans[x]=x;
    rem--;
    if(rem==0){
      print();
      exit(0);
    }
  }
  for(int i=0;i<a[x].size();i++){
    if(vis[a[x][i]]) continue;
    vis[a[x][i]]=true;
    if(ans[a[x][i]]==0){
      ans[a[x][i]]=x;
      rem--;
      if(rem==0){
        print();
        exit(0);
      }
    }
    bfs(a[x][i]);
  }
  return;
}
int main(){
  scanf("%d%d",&n,&m);
  rem=n;
  for(int i=1;i<=m;i++){
    scanf("%d%d",&u,&v);
    a[v].push_back(u);
  }
  for(int i=n;i>=1;i--) bfs(i);
  return 0;
}

这题建议深搜
给个dfs代码:

void dfs(int x){
	if(ans[x]){
		return;
	}
	ans[x]=i;//雨露均沾,给这个点能到达的所有点中的所有点都算出来了 
	for(int i=0;i<g[x].size();i++){
		int u=g[x][i];
		dfs(u);
	}
}

给个方案谢谢

知道了,但是为什么广搜会WA? 能不能解释一下

好像发现问题了,一个点多算了两遍