蓝桥杯题目----发现环(并查集检验环的问题,vector容器问题)

本文介绍了一种使用C++实现的寻找并标记图中环形链表的算法,通过深度优先搜索(DFS)和并查集数据结构,解决给定邻接矩阵中是否存在环的问题。关键步骤包括初始化并查集、合并节点集合、以及在DFS中检测环的条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.vector vt[N] 容器

2.vt[a].push_back(b);//把b放到a的容器里
vt[b].push_back(a); //把a放到b的容器里

#include<bits/stdc++.h>
using namespace std;
const int N=1e5; 
vector<int> vt[N];
int vis[N],s[N],circle[N];
int num,start,step,flag;
 //num 环的元素个数 
//start 检验环(dfs)开始的元素 
//step circle环数组下标数,元素数
//flag 当出现环时,返回1 
void init_set(){
    for(int i=1;i<=N;i++)   s[i]=i;
}
int find_set(int x){
    if(x!=s[x])  s[x]=find_set(s[x]);
    return s[x];
}
void merge_set(int x,int y){
    int tmp = x;
    x = find_set(x);
    y = find_set(y);
    if(x!=y) s[y]=s[x];
    else  start = tmp; //x,y有共同的祖先,且xy相连.此x和y处于环中,记录一个点
//返回点start
}
void dfs(int x,int step)//step相当于数组下标1,2,3
{
    //截断条件
    if(flag) return;
    if(x==start)//形成环了
    {
        if(vis[x]==1) // 被访问过 就是dfs开始的点
        {
            num=step-1;
            flag=1;
            return;
        }

    }
    //搜索条件
    circle[step]=x;  //是环--放到环形数组里
    for(int i=0;i<vt[x].size();i++)
    {
        int y=vt[x][i];  //容器x里第i个数
        if(!vis[y])//如果Y没被访问过
        {
            vis[y]=1;
            dfs(y,step+1);
            vis[y]=0;
        }
    }
}

int main()
 {
      int n;
      cin>>n;
      init_set();
      for(int i=1;i<=n;i++)
      {
          int a,b;
          cin>>a>>b;
          vt[a].push_back(b);
          vt[b].push_back(a);//把b放到a的容器里 把a放到b的容器里 
          merge_set(a,b); //找到共同连接a,b的
          
      }
      flag=0;
      dfs(start,1);
      sort(circle+1,circle+1+num);
      for(int i=1;i<=num;i++)
      cout<<circle[i]<<" ";
      return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值