PAT 甲级 1094 The Largest Generation (25分) DFS BFS

tech2025-04-23  9

题目

PAT 甲级 1094 The Largest Generation (25分) DFS BFS

思路

DFS

BFS

易错点

1 DFS中,book[level]++在递归退出条件之前,因为每次进入dfs都是一个结点,所以要统计 2 BFS中,最开始入队列的是1,因为题目已知1号结点为根结点,bfs要从根结点开始

题解

DFS

#include <iostream> #include <vector> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int maxn = 110; vector<int> vs[maxn]; int book[maxn],maxl; void dfs(int v,int level){ book[level]++; //易错点,只要有结点进入dfs,对应层就加1 maxl = max(maxl,level); if(vs[v].size()==0)return; for(int i=0;i<vs[v].size();i++){ dfs(vs[v][i],level+1); } } int main(int argc,char * argv[]){ int n,m,id,k,cid; scanf("%d%d",&n,&m); for(int i=0;i<m;i++){ scanf("%d%d",&id,&k); for(int j=0;j<k;j++){ scanf("%d",&cid); vs[id].push_back(cid); } } // 2 dfs dfs(1,1); // 3 找到结点数最多的层 int maxpi=0; //人数最多的群 for(int i=1;i<=maxl;i++){ if(book[i]>book[maxpi]){ maxpi = i; } } printf("%d %d",book[maxpi],maxpi); return 0; }

BFS

#include <iostream> #include <vector> #include <cstring> #include <unordered_map> #include <stack> #include <queue> #include <algorithm> #include <cmath> using namespace std; const int maxn = 110; vector<int> vs[maxn]; // book 记录每层节点总数,level 记录结点在哪一层 // maxpi 记录最多人数层号,maxp 记录最多人数 int book[maxn],maxpi,maxp,level[maxn]; void bfs(){ queue<int> q; q.push(1); level[1]=1; while(!q.empty()){ int now = q.front(); q.pop(); book[level[now]]++; if(book[level[now]]>maxp){ maxp = book[level[now]]; maxpi = level[now]; } for(int i=0;i<vs[now].size();i++){ level[vs[now][i]]=level[now]+1; q.push(vs[now][i]); } } } int main(int argc,char * argv[]){ int n,m,id,k,cid; scanf("%d%d",&n,&m); for(int i=0;i<m;i++){ scanf("%d%d",&id,&k); for(int j=0;j<k;j++){ scanf("%d",&cid); vs[id].push_back(cid); } } // 2 dfs bfs(); printf("%d %d",maxp,maxpi); return 0; }
最新回复(0)