一本通bfs题目集(下):1361、1362

经过4道bfs题,和一个模板的梳理,我迎来了最后一集bfs题(3.2队列)。

好勒,我先开写了。


1361:比较简单,注意枚举时的一些细节。

代码:

#include

using namespace std;

int n,k,tot,a1[20],a2[20];//从a1变为a2数组

bool  b[10050];

int main()

{

  cin>>n>>k;

  queue q;//队列

  for(int i=1; i<=k; i++) cin>>a1[i]>>a2[i];//输入

  q.push(n);

  b[n]=1;

  tot=1;//将原数入队

  while(!q.empty())

  {

    int c=q.front(),w=1;//w为位数

    while(c>0)

    {

      int x=c%10;//取当前这一位

      for(int i=1; i<=k; i++)

        if(a1[i]==x) //当可以替换时

        {

          int j=q.front()+(a2[i]-x)*w;//产生新数

          if(!b[j]) //没出现

          {

            b[j]=1;

            q.push(j);

            tot++;//改变总数、状态、入队

          }

        }

      c/=10;

      w*=10;//下一位

    }

    q.pop();//弹出

  }

  cout<

  return 0;

}

代码写的还算详细,我就不特别说明了。可以好好看看这些斜体代码,这就是这次bfs的精华,还是有点难度的。


1362:差不多,你可以把它看成一个树状,或者一个图状。我用的是一个bool数组,来表示这次的关系。

代码来了:

#include

using namespace std;

int n,k,maxn,a1,a2,ans;

bool b[105][105],bb[105];

void bfs(int k)

{

  int tot=1;//最少一个

  queue q;

  bb[k]=true;

  q.push(k);//推入“祖辈”的第一个人

  while(!q.empty())//队列非空

  {

    int nn=q.front();//取出队首,进行扩张

    q.pop();

    for(int i=1; i<=n; i++)

      if(b[nn][i]&&!bb[i])//两人有关系且i没访问过

      {

        bb[i]=true;

        q.push(i);

        tot++;//改变性质,推入队列,增加人数

      }

  }

  if(tot>maxn) maxn=tot;//最多人数统计

}

int main()

{

  cin>>n>>k;

  for(int i=1; i<=k; i++)

  {

    cin>>a1>>a2;

    b[a1][a2]=1;

    b[a2][a1]=1; //两边都要记录哦

  }

  for(int i=1; i<=n; i++)

    if(!bb[i])//没被访问过

    {

      bfs(i);

      ans++;

    }//只要能开一个新家庭,就增加总数

  cout<

  return 0;

}


好,这次就到这,一本通主要的另一部分bfs题——3.2栈讲完了,我下面会写一些随记。

你可能感兴趣的:(一本通bfs题目集(下):1361、1362)