zoukankan      html  css  js  c++  java
  • 洛谷P3916题解

    原题:

     思路:

    emmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

    这玩意儿不就是一个深搜解决?

    一看难度,绿的

    行吧看来我把它想简单了

    而且深搜确实有些问题

    就题面来看,如果进行深搜,就意味着我们要不断地访问同一个点

    浪费时间啊

    能不能一次求出呢?

    思考过后我们发现,显然,如果一个点能被多个点访问,那么这个点也可以通过反向的边访问多个点

    而如果我们将开始顺序由“从小到大”变为“从大到小”

    实际上就已经可以用一次遍历求出多个点的解

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    int nxt[100005],last[100005],to[100005],tot,book[100005];
    void DFS(int dep,int u)
    {
        if(book[dep])
            return;
        book[dep]=u;
        for(int i=last[dep];i!=0;i=nxt[i])
            if(!book[to[i]])
                DFS(to[i],u);
    }
    void add_edge(int a,int b)
    {
        nxt[++tot]=last[b];
        last[b]=tot;
        to[tot]=a;
    }
    int main()
    {
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int a1,a2;
            scanf("%d %d",&a1,&a2);
            add_edge(a1,a2);
        }
        for(int i=n;i;i--)
            DFS(i,i);
        for(int i=1;i<=n;i++)
            printf("%d ",book[i]);
        return 0;
    }
  • 相关阅读:
    12.4
    12.3
    学期总结
    12.20 期末考试总结
    12.18 准备
    12.17 CSS学习
    12.16 CSS学习
    12.15 CSS学习
    12.14 学习总结
    12.11 AJAX的基础知识
  • 原文地址:https://www.cnblogs.com/lujin49/p/13873374.html
Copyright © 2011-2022 走看看