zoukankan      html  css  js  c++  java
  • 试题 历届试题 发现环(dfs)

    问题描述
      小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。


      不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG。


      为了恢复正常传输。小明需要找到所有在环路上的电脑,你能帮助他吗?
    输入格式
      第一行包含一个整数N。
      以下N行每行两个整数a和b,表示a和b之间有一条数据链接相连。


      对于30%的数据,1 <= N <= 1000
      对于100%的数据, 1 <= N <= 100000, 1 <= a, b <= N


      输入保证合法。
    输出格式
      按从小到大的顺序输出在环路上的电脑的编号,中间由一个空格分隔。
    样例输入
    5
    1 2
    3 1
    2 4
    2 5
    5 3
    样例输出
    1 2 3 
    题目大意,找到环,便输出这个环,按从小到大排序。
    #include<bits/stdc++.h>
    using namespace std;
    vector<int>es[100005];
    vector<int>ans;
    int n,a,b; 
    int pre[100005];
    bool vis[100005];
    bool isend=false;
    void dfs(int k)
    {
    
        vis[k]=1;
        for(int i=0;i<es[k].size();i++){
            if(isend)return ;
            int v=es[k][i];
            if(!vis[v]){///没有访问过
                pre[v]=k;///将这个点的父亲设为k
                dfs(v);///继续深搜
            }
            else if(pre[k]!=v){///如果访问过、并且不是这个k点的父亲的话证明是环
                ans.push_back(v);
                while(v!=k){///将环各个点进数组
                    ans.push_back(k);
                    //cout<<k<<endl;
                    k=pre[k];
                }
                isend=true;///标记方便退出
                sort(ans.begin(),ans.end());///从小到大排下序
                for(int i=0;i<ans.size();i++){
                    cout<<ans[i]<<" ";
                } 
                return ;
            }
        }
        
    }
    int main()
    {
        cin>>n;
        memset(vis,0,sizeof(vis));
        memset(pre,0,sizeof(pre));
        for(int i=0;i<n;i++){
            cin>>a>>b;
            es[a].push_back(b);///无向图
            es[b].push_back(a);
        }
        dfs(1);
     } 

     

     
  • 相关阅读:
    笑话几则
    .net 知识点滴
    LoadRunner本机录制http协议程序遇到的问题以及解决方法
    40款非常棒的 jQuery 插件和制作教程(系列二)
    50个极佳的企业网站案例
    jQuery ui effects
    9个优秀网上免费标签云生成工具
    30 +创意的登录页面设计灵感
    分享一个jQuery的时间轴插件:TimergliderJS
    36个非常有趣的互动网站设计作品范例
  • 原文地址:https://www.cnblogs.com/mohari/p/12939664.html
Copyright © 2011-2022 走看看