分而治之,图的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

猜你喜欢

转载自blog.csdn.net/qq_40795475/article/details/88715145