蓝桥练习题-发现环

本文介绍了一种在C++中利用邻接表检测图中环的方法,通过维护一个关系表和节点连接数记录,找出仅与一个节点相连的节点,从而逐步找到环并输出。
摘要由CSDN通过智能技术生成

0发现环 - 蓝桥云课 (lanqiao.cn)

思路:既然要找环,那必然有单独存在的电脑,即该电脑只与一台电脑相连,开一个vector<ll>rel[N]作为记录电脑之间的关系表,然后再开一个ListContact[N] 记录每个电脑分别与多少电脑相连,从起点出发,删掉ListContact[N]==1的点,然后循环,直到删完了所有ListContact[N]==1的点,剩余的点就是环中的一部分了,按顺序输出即可。tips:N一定要开大点,不然只能过部分,当时写的时候一直在纠结哪写错了,到最后发现数组开小了

C++代码:

#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
const ll N=100010;//N要开大,不然只能过30%左右/(ㄒoㄒ)/~~
vector<ll>rel[N];//电脑之间联系表
ll n;
ll ListContact[N];//记录每个节点与几个节点相连,删除只有一个点相连的,剩下的就构成环了
void solve(){
  for(int i=1;i<=n;i++){
    if(ListContact[i]==1){
      int temp=i;
      while(ListContact[temp]==1){//沿着删除的节点一直下去,直到遇到与两个点相连的
        int temp2=rel[temp][0];//因为只有一个点相连,所以肯定是rel[temp][0]
        ListContact[temp2]--;
        temp=temp2;//若仍只有一个,继续删
      }
    }
  }
}
int main()
{
  // 请在此输入您的代码
  cin>>n;
  int a,b;
  for(ll i=1;i<=n;i++){
    cin>>a>>b;
    rel[a].push_back(b);
    rel[b].push_back(a);
    ListContact[a]++;
    ListContact[b]++;
  }
  solve();
  for(int i=1;i<=n;i++){//按顺序输出即可
    if(ListContact[i]>1){
      cout<<i<<' ';
    }
  }

  return 0;
}

希望对有需要的人能有所帮助,欢迎大家有什么问题到评论区里一起讨论!

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值