洛谷 P3916 图的遍历(图上DFS)

题目链接

反向建边+dfs。从最大值开始搜索。

AC代码如下:

#include <algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#define MAXN 100005
using namespace std;int n,m,temp1,temp2,ans[MAXN];
vector<int>map1[MAXN];
void dfs(int deep,int x){
    if(!ans[deep])
        ans[deep]=x;
    else
        return;
    for(int i=0;i<map1[deep].size();i++){
        dfs(map1[deep][i],x);
    }
}
int main(){
    scanf("%d%d",&n,&m);
    memset(ans,0,sizeof(ans));
    for(int i=0;i<m;i++){
        scanf("%d%d",&temp1,&temp2);
        map1[temp2].push_back(temp1);
    }
    for(int i=n;i>0;i--)
        dfs(i,i);        
    for(int i=1;i<=n;i++)
        printf("%d ",ans[i]);
    return 0;
}

 

posted @ 2021-03-03 16:34  mikku  阅读(47)  评论(0)    收藏  举报