经过4道bfs题,和一个模板的梳理,我迎来了最后一集bfs题(3.2队列)。
好勒,我先开写了。
1361:比较简单,注意枚举时的一些细节。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,k,tot,a1[20],a2[20];//从a1变为a2数组
bool b[10050];
int main()
{
cin>>n>>k;
queue<int> 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<<tot<<endl;
return 0;
}
代码写的还算详细,我就不特别说明了。可以好好看看这些斜体代码,这就是这次bfs的精华,还是有点难度的。
1362:差不多,你可以把它看成一个树状,或者一个图状。我用的是一个bool数组,来表示这次的关系。
代码来了:
#include <bits/stdc++.h>
using namespace std;
int n,k,maxn,a1,a2,ans;
bool b[105][105],bb[105];
void bfs(int k)
{
int tot=1;//最少一个
queue<int> 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<<ans<<" "<<maxn<<endl;//总数,最多数
return 0;
}
好,这次就到这,一本通主要的另一部分bfs题——3.2栈讲完了,我下面会写一些随记。