7654-跳山登山赛


本文总阅读量

题意要求从降落点能够访问的最高山峰编号,如果从每个节点出发去寻找最高峰,时间复杂度为O(N2),必然超时。不妨逆向思考,把方向反一下,即反向建图,然后从最高峰开始枚举,看它能够访问到哪些节点,就意味着这些节点都能访问此高峰。

void dfs(int x,int h){ //x为顶点编号 h为当前最高峰
    ans[x]=h;  //x能访问到h
    vis[x]=1;
    for(auto y:G[x]){
        if(vis[y]==0)dfs(y,h);
    }
}

主程序需要从高到低枚举山峰。

    for(int i=n;i>=1;i--){
        if(vis[i]==0)dfs(i,i); //i出发,当前最高峰编号i
    }

本站总访问量