分而治之,图的dfs遍历问题 注意用邻接表存储不然会内存超出

#include <bits/stdc++.h>
using namespace std;
const int maxn=10001;
vector<int>v[maxn];//临接表
bool visited[maxn]={false};
int n,m,k;
void dfs(int s)//对一个点进行深度遍历的具体描述
{
   visited[s]=true;
   if(v[s].size()==0)
       return ;
   for(int i=0;i<v[s].size();++i)//对s的了邻接点进行遍历
   {
          if(visited[v[s][i]]==false)
          dfs(v[s][i]);
   }
}
int  depth()//对图进行深度遍历求深度
{
       int cnt=0;
  for(int i=1;i<=n;++i)
  {
     if(visited[i]==false)
     {
           dfs(i);
           cnt++;
     }

  }
  return cnt;

}
int main()
{
    cin>>n>>m;
    for(int i=0;i<m;++i)//把边与边之间的关系存起来
    {
       int a,b;
       cin>>a>>b;
      v[a].push_back(b);
      v[b].push_back(a);
    }
    cin>>k;//k个方案
    while(k--)
    {

       memset(visited,0,sizeof(visited));//初始化所有顶点都没有访问过
       int cnt=0;//表示经过攻占得到的图的连通块的数量
        int np;
        cin>>np;
        for(int i=0;i<np;++i)//
        {
           int city;
           cin>>city;
           visited[city]=true;
        }
         cnt=depth();
       if(cnt+np==n)
       {
         cout<<"YES"<<endl;
       }
       else
         cout<<"NO"<<endl;

    }



}

https://pintia.cn/problem-sets/994805046380707840/problems/994805056195379200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值