其他分享
首页 > 其他分享> > P3916 图的遍历

P3916 图的遍历

作者:互联网

P3916 图的遍历

题意:求各个点所能到达最大的编号

 

按正常情况去遍历图,会超时和爆内存,得到20分(起码我只拿了20)

换个思路来求,编号大的地点可以到达哪些点

思路:

  1. 反向建边
  2. 从编号大的点开始dfs,dfs传递初始编号d,这是遍历到的点的答案
  3. 若当前点被访问过了说明被更大的点访问过了,遂return结束
#include<iostream>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;

int n,m;
vector<int> son[100010];
int ans[100010];
bool st[100010];
void dfs(int u,int d)
{ 
    if(ans[u])  return;
    ans[u]=d;
    for(auto v:son[u])
        if(st[v]==false)
        {
            st[v]=true;
            dfs(v,d);
        }
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;    cin>>x>>y;
        son[y].push_back(x);
    }
    for(int i=n;i>=1;i--)
        dfs(i,i);
    
    for(int i=1;i<=n;i++)
        cout<<ans[i]<<" ";
    cout<<endl;
    return 0;
}

 

标签:遍历,int,dfs,son,P3916,ans,include
来源: https://www.cnblogs.com/magicat/p/16535165.html