Each input file contains one test case. Each case starts with two positive integers N (<100) which is the total number of family members in the tree (and hence assume that all the members are numbered from 01 to N), and M (<N) which is the number of family members who have children. Then M lines follow, each contains the information of a family member in the following format:
ID K ID[1] ID[2] ... ID[K]
where ID is a two-digit number representing a family member, K (>0) is the number of his/her children, followed by a sequence of two-digit ID's of his/her children. For the sake of simplicity, let us fix the root ID to be 01. All the numbers in a line are separated by a space.
For each test case, print in one line the largest population number and the level of the corresponding generation. It is assumed that such a generation is unique, and the root level is defined to be 1.
23 13 21 1 23 01 4 03 02 04 05 03 3 06 07 08 06 2 12 13 13 1 21 08 2 15 16 02 2 09 10 11 2 19 20 17 1 22 05 1 11 07 1 14 09 1 17 10 1 18
9 4
#include <iostream>
#include <vector>
using namespace std;
const int maxn=110;
int n,m,father,childnum,child;
int levelnum[maxn]={0},maxlevel=1,maxnum=0; //设置一个某层结点个数数组,结点个数最多的层次及该层层号
vector<int> Node[maxn]; //树,每个Node[]里面存储子结点编号
void DFS(int now,int level){ //DFS遍历树(传入结点号与层号)
levelnum[level]++;
if(levelnum[level]>maxnum){ //更新结点最多的层号及结点个数
maxnum=levelnum[level];
maxlevel=level;
}
for(int i=0;i<Node[now].size();i++) //遍历当前结点的子树
DFS(Node[now][i],level+1);
}
int main(){ cin>>n>>m;
for(int i=0;i<m;i++){
cin>>father>>childnum;
for(int j=0;j<childnum;j++){
cin>>child;
Node[father].push_back(child);
}
}
DFS(1,1);
cout<<maxnum<<" "<<maxlevel;
return 0;
}
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner in = new Scanner(System.in); Queue<Integer> q = new LinkedList<Integer>(); int n = in.nextInt(); int m = in.nextInt(); int[] num = new int[n+1]; int[][] ar = new int[n+1][100]; for (int i = 0; i < m; i++) { int k = in.nextInt(); num[k] = in.nextInt(); for (int j = 0; j < num[k]; j++) { ar[k][j] = in.nextInt(); } } int max = 1; int count = 1; int h = 0; int maxh = 1; q.add(1); while (!q.isEmpty()) { h++; if (count > max) { max = count; maxh = h; } int t = 0; for (int i = 0; i < count; i++) { int v = q.remove(); for (int j = 0; j < num[v]; j++) { q.add(ar[v][j]); } t += num[v]; } count = t; } in.close(); System.out.println(max + " " + maxh); } }
#include<bits/stdc++.h> using namespace std; int main() { vector<int> son[105]; int N,M; cin>>N>>M; while(M--) { int i, k, t; cin>>i>>k; while(k--) { cin>>t; son[i].push_back(t); } } { int cnt=0, cnt_pre, cnt_now, level(1),r_l; queue<int> Q; Q.push(1); cnt_pre = 1; while(!Q.empty()) { cnt_now = 0; ++level; while(cnt_pre--) { int now = Q.front(); Q.pop(); for(int i=0; i<son[now].size(); ++i,++cnt_now) Q.push(son[now][i]); } cnt_pre = cnt_now; if(cnt_now > cnt) { cnt = cnt_now; r_l = level; } } cout<<r_l<<" "<<cnt<<endl; } return 0; }
#include <stdio.h> #include <malloc.h> int get_gen(int *family, int child) { int gen = 1; while (family[child] != child) { gen++; child = family[child]; } return gen; } int main() { int N, M; scanf("%d %d", &N, &M); int *family = (int *) malloc((N + 1) * sizeof(int)); for (int i = 0; i <= N; ++i) { family[i] = i; } for (int i = 0; i < M; ++i) { int parent; int child_num; scanf("%d %d", &parent, &child_num); for (int j = 0; j < child_num; ++j) { int child; scanf("%d", &child); family[child] = parent; } } int *gen = (int *) malloc((N + 1) * sizeof(int)); for (int i = 0; i <= N; ++i) { gen[i] = 0; } for (int i = 1; i <= N; ++i) { gen[get_gen(family, i)]++; } int max_gen = 0, max_member = 0; for (int i = 1; i <= N; ++i) { if (gen[i] > max_member) { max_member = gen[i]; max_gen = i; } } printf("%d %d", max_member, max_gen); free(family); free(gen); return 0; }
//使用map存储数据,BFS+队列处理数据,优先队列存储结果 #include <bits/stdc++.h> using namespace std; //问题表示 int N, M; map<string, vector<string>> node; //{01:{03, 02, 04, 05}} //问题求解 queue<string> qu; struct Cmp { bool operator()(pair<int, int> p1, pair<int, int> p2) { return p1.second < p2.second; } }; priority_queue<pair<int, int>, vector<pair<int, int>>, Cmp> res; //res:{{代, 总个数},...} void create_instance() { cin >> N >> M; for (int i = 0; i < M; i++) { string father_code; int son_num; cin >> father_code >> son_num; for (int i = 0; i < son_num; i++) { string son_code; cin >> son_code; node[father_code].push_back(son_code); } } } void bfs() { for (auto code : node["01"]) qu.push(code); int cnt = 2; res.push({ 1, 1 }); res.push({ cnt, qu.size() }); while (!qu.empty()) { int qu_num = qu.size(); for (int i = 0; i < qu_num; i++) { string son = qu.front(); qu.pop(); if (node.find(son) != node.end()) { for (auto code : node[son]) qu.push(code); } } res.push({ ++cnt, qu.size() }); } } int main() { create_instance(); bfs(); cout << res.top().second << " " << res.top().first << endl; }
#include<iostream> using namespace std; int n,m; int f[100]={0},g[100]={0}; int getg(int x) { if(g[x]==-1) return g[x]=getg(f[x])+1; return g[x]; } int main() { fill(g,g+100,-1);g[1]=1; int i,j,x,num,son; cin>>n>>m; for(i=0;i<m;i++) { cin>>x>>num; for(j=0;j<num;j++) { cin>>son; f[son]=x; } } int a[n]={0}; for(i=1;i<=n;i++) a[getg(i)]++; int max=1,id=1; for(i=1;i<n;i++) { if(a[i]>max) { max=a[i]; id=i; } } cout<<max<<' '<<id; return 0; }
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int getGenerate(int *family, int child) { int gen = 1; while(family[child] != child) { gen++; child = family[child]; } return gen; } int main() { int N,M; cin>>N>>M; int *family = (int *)malloc((N+1)*sizeof(int)); for(int i=0;i<=N;i++) family[i] = i; for(int i=0;i<M;i++) { int parent; int child_num; cin>>parent>>child_num; for(int j=0;j<child_num;j++) { int child; cin>>child; family[child] = parent; } } int *gen = (int *)malloc((N+1)*sizeof(int)); for(int i=0;i<=N;i++) gen[i] = 0; for(int i=1;i<=N;i++) gen[getGenerate(family, i)]++; int maxGen = 0, maxMember = 0; for(int i=1;i<=N;i++) if(gen[i] > maxMember) { maxMember = gen[i]; maxGen = i; } cout<<maxMember<<" "<<maxGen<<endl; free(family); free(gen); return 0; }
#include<bits/stdc++.h> using namespace std; int N, M; struct Person{ string ID; vector<string> child; }; vector<Person> persons;//所有人 set<string> isChild;//是某个人的孩子,存这,用来找第一代 vector<string> getChild(string ID){//根据ID来获取此人的孩子 vector<string> res; for (int i = 0; i < M; i++){ if (persons[i].ID == ID)return persons[i].child; } return res; } int main(){ ios::sync_with_stdio(false); cin >> N >> M; persons.resize(M); int k; for (int i = 0; i < M; i++){ cin >> persons[i].ID; cin >> k; persons[i].child.resize(k); for (int j = 0; j < k; j++){ cin >> persons[i].child[j]; isChild.insert(persons[i].child[j]); } } //bfs,初始化,第一代人先入队列1 vector<string> rootGen; for (int i = 0; i < M; i++){ if (find(isChild.begin(), isChild.end(), persons[i].ID) == isChild.end()){//初代都不在isChild集合里 rootGen.push_back(persons[i].ID); } } int MaxPop = rootGen.size(); int MaxLevel = 1; int level = 1; //循环队列,一队列一代人,前一代人从某个队列出完,后一代人正好全部进入另一个队列 queue<string> myQue1; queue<string> myQue2; int PushSize = 0; for (int i = 0; i < rootGen.size(); i++){ myQue1.push(rootGen[i]); PushSize++; } set<string> Gen;//可能会重复所以用set保存,最后计数 while (!myQue1.empty() || !myQue2.empty()){ if (!myQue1.empty()){ Gen.clear(); while (!myQue1.empty()){ string front = myQue1.front(); Gen.insert(front); myQue1.pop(); vector<string> child = getChild(front); for (int i = 0; i < child.size(); i++){ myQue2.push(child[i]); } } int pop = Gen.size(); if (pop>MaxPop){ MaxPop = pop; MaxLevel = level; } level++; } else if (!myQue2.empty()){ Gen.clear(); while (!myQue2.empty()){ string front = myQue2.front(); Gen.insert(front); myQue2.pop(); vector<string> child = getChild(front); for (int i = 0; i < child.size(); i++){ myQue1.push(child[i]); } } int pop = Gen.size(); if (pop>MaxPop){ MaxPop = pop; MaxLevel = level; } level++; } } cout << MaxPop << " " << MaxLevel << endl; return 0; }
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); Node[] nodes = new Node[n+1]; for(int i = 0;i<m;i++){ int id = in.nextInt(); int k = in.nextInt(); Node node = new Node(id,k); for(int j = 0;j<k;j++) node.addChild(in.nextInt()); nodes[id] = node; } int generation = 0; int size = 0; int maxs = -1; int maxg = -1; Queue<Node> queue = new LinkedList<Node>(); queue.add(nodes[1]); while(!queue.isEmpty()){ generation++; size = queue.size(); if(size>maxs){ maxs = size; maxg = generation; } if(maxs>n/2) break; while(size-- != 0){ Node top = queue.poll(); while(top!=null&&!top.isEmpty()){ queue.add(nodes[top.getChild()]); } } } System.out.println(maxs+" "+maxg); } private static class Node{ int id; int[] children; int pos = 0; public Node(int id, int k) { this.id = id; this.children = new int[k]; } public void addChild(int id){ children[pos++]=id; } public int getChild(){ return children[--pos]; } public boolean isEmpty(){ return pos==0; } } }
#include<bits/stdc++.h> using namespace std; const int Max=110; vector<int> child[Max]; int Hashtable[Max]= {0}; void DFS(int index,int level) { Hashtable[level]++; for(int i=0; i<child[index].size(); i++) { DFS(child[index][i],level+1); } } int main() { int n,m,father,k,ch; scanf("%d %d",&n,&m); for(int i=0; i<m; i++) { scanf("%d %d",&father,&k); for(int j=0; j<k; j++) { scanf(" %d",&ch); child[father].emplace_back(ch); } } DFS(1,1); int MaxV=0,ans; for(int i=1; i<Max; i++) { if(Hashtable[i]>MaxV) { MaxV=Hashtable[i]; ans=i; } } printf("%d %d\n",MaxV,ans); return 0; }
#include<bits/stdc++.h> using namespace std; int n,m,p,k,c; int f_num,f_l; vector<int> childs[100]; queue<int> q; int main(){ cin>>n>>m; while(m--){ cin>>p>>k; while(k--){ cin>>c; childs[p].push_back(c); } } q.push(1);int l=1;int p_num=1; //BFS while(!q.empty()){ l++;int n_num=0; for(int i=0;i<p_num;i++){ int tp=q.front();q.pop(); for(int j=0;j<childs[tp].size();j++){ q.push(childs[tp][j]); } n_num+=childs[tp].size(); } if(n_num>f_num){ f_num=n_num;f_l=l; } p_num=n_num; } cout<<f_num<<" "<<f_l; }
#include <iostream> (720)#include <stdio.h> #include <string> (765)#include <string.h> #include <queue> (789)#include <algorithm> #include <math.h> (865)#include <map> #include <stack> (850)#include <set> #include <vector> (721)#include <cctype> #define INF 1e9 using namespace std; string Int2Str[10]={"0","1","2","3","4","5","6","7","8","9"}; int main(){ int total, n; while(cin>>total>>n){ vector<int> family[total+1]; int root=1; for(int i=0; i<n; i++){ int id, k; cin>>id>>k; while(k--){ int x; cin>>x; family[id].push_back(x); } } queue<int> Q; Q.push(root); int generation=0, population=0; int buf[110], level=1; memset(buf, 0, sizeof(buf)); while(total){ int len=Q.size(); for(int i=0; i<len; i++){ int x=Q.front(); Q.pop(); buf[level]++; for(int j=0; j<family[x].size(); j++) Q.push(family[x][j]); } total-=len; level++; } for(int i=1; i<level; i++){ if(buf[i]>population){ population=buf[i]; generation=i; } } cout<<population<<" "<<generation<<endl; } }
#include <cstdio> #include <vector> #include <string> #include <map> #include <queue> #include <iostream> #include <algorithm> #include <math.h> using namespace std; const int maxn = 110; int n,m; int num[maxn]; //map<string,int>mp; //map<int,string>mp1; //用string的原因是因为id是两位组成 struct Node{ int id;//自己的id int k;//孩子数 int generation; vector<int> chid ;//孩子的id }node[maxn]; /*void StringtoInt(){ fill(num,num + maxn,0); int ans = 0; for(int i = 0;i < n;i++){ string s = node[i].id; if(s[0] == '0') mp[s] = s[s.size() - 1] - '0'; else{ for(int i = 0;i < s.size();i++){ ans += (s[i] - '0') * pow(10,(s.size() - 1 - i)); } mp[s] = ans; } } }*/ /*void InttoString(){ for(int i = 0;i < n;i++){ mp1[i] = node[i].id; } }*/ int main(){ int ans = 0; fill(num,num + maxn,0); int id; scanf("%d%d",&n,&m); for(int i = 1;i <= n;i++){ node[i]. k = 0; node[i].id = i; node[i].generation = 0; } for(int i = 0;i < m;i++){ cin >> id; node[id].id = id; scanf("%d",&node[id].k); for(int j = 0;j < node[id].k;j++){ int child; cin >> child; node[id].chid.push_back(child); } } //StringtoInt(); //InttoString(); queue<Node> q; node[01].generation = 1; q.push(node[01]); while(!q.empty()){ q.front().generation = node[q.front().id].generation; Node top = q.front(); q.pop(); if(top.k > 0){ for(int j = 0;j < top.k;j++){ int x = top.chid[j]; //cout << top.generation << " "; q.push(node[x]); node[x].generation = top.generation + 1; //cout << node[x].generation << " "; } } } int max = 0; int k; for(int i = 1;i <= n;i++){ num[node[i].generation]++; } for(int i = 1;i <= n;i++){ if(max < num[i]){ max = num[i]; k = i; } } printf("%d %d",max,k); return 0; }
#include <iostream> #include <vector> #include <map> #include <string> #include <queue> using namespace std; int main(){ int N, M; cin >> N >> M; vector<vector<int>> tree(N + 1); auto to_num = [](auto id){ return (id[1] - '0') + (id[0] - '0') * 10; }; // cout << to_num(string("01")) << endl; for(int i = 0; i < M; i++){ string id; int ch; cin >> id >> ch; int k0 = to_num(id); for(int j = 0; j < ch; j++){ cin >> id; int k = to_num(id); tree[k0].push_back(k); } } int root = to_num(string("01")); int current_level = 1, current_cnt = 1, next_cnt = 0; int MAX_LEVEL = current_level, MAX_CNT = current_cnt; queue<int> que; que.push(root); while(!que.empty()){ // cout << "size: " << que.size() << endl; int mem = que.front(); que.pop(); next_cnt += tree[mem].size(); for(int k : tree[mem]){ que.push(k); } current_cnt--; if(current_cnt == 0){ if(next_cnt > MAX_CNT){ MAX_CNT = next_cnt; MAX_LEVEL = current_level + 1; } current_level++; current_cnt = next_cnt; next_cnt = 0; } } cout << MAX_CNT << " " << MAX_LEVEL << endl; }
import java.util.Scanner; import java.util.Queue; import java.util.LinkedList; public class A1005 { private static int M, N; private static int[][] familyTree;// 看成有向图 用邻接矩阵存储 private static Queue<Integer> childQueue; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); familyTree = new int[N + 1][N + 1];// 从01开始,所以大小为N+1,弃去一行一列 childQueue = new LinkedList<>(); for (int i = 0; i < M; i++) { int v = sc.nextInt(); int numOfChild = sc.nextInt(); for (int j = 0; j < numOfChild; j++) { int child = sc.nextInt(); familyTree[v][child] = 1; } } sc.close(); int result = 1; int resLevel = 1; childQueue.add(1); int numOfChild = 1; for (int level = 1; !childQueue.isEmpty(); level++) { int index = numOfChild; numOfChild = 0; for (int i = 0; i < index; i++) { int child = childQueue.poll(); for (int j = 1; j < N + 1; j++) { if (familyTree[child][j] == 1) { childQueue.add(j); numOfChild++; } } } if(numOfChild>result) { result = numOfChild; resLevel = level+1; } } System.out.print(result+" "+resLevel); } }
就是一个BFS遍历树,这里要注意的是需要特判节点最多的是不是最后一层,如果不特判的话在牛客可以过但是在PAT官网上是过不去的,希望能帮到牛客过了但是PAT WA还没找到问题的人
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n,m,ans_num=1,ans_gen=1,prev_gen=1,prev_num=1;
vector<int> v[105];
struct node
{
int gen,id;
node(int gen=1,int id=1)
{
this->gen=gen;
this->id=id;
}
};
queue<node> q;
int main()
{
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++)
{
int id,k;
scanf("%d %d",&id,&k);
for(int j=0;j<k;j++)
{
int idk;
scanf("%d",&idk);
v[id].push_back(idk);//记录每个点的子节点
}
}
for(int i=0;i<v[1].size();i++)
q.push(node(2,v[1][i]));//第一层先压队列
while(!q.empty())
{
node now=q.front();
q.pop();
if(now.gen!=prev_gen)//每次到了全新一层就判断是否更新答案与更新层数
{
if(prev_num>ans_num)
{
ans_num=prev_num;
ans_gen=prev_gen;
}
prev_gen=now.gen;
prev_num=0;
}
prev_num++;
for(int i=0;i<v[now.id].size();i++)
q.push(node(prev_gen+1,v[now.id][i]));
}
if(prev_num>ans_num)//这里注意判断一下,因为可能节点最多的在最后一层
{
ans_num=prev_num;
ans_gen=prev_gen;
}
printf("%d %d",ans_num,ans_gen);
return 0;
}
def loopone(lstin): global con tem = [] for i in range(0,len(lstin)): for j in range(2,len(lstin[i])): for k in lst: if k[0] == lstin[i][j]: con = con+k[1] tem.append(k) lst.remove(k) return temdef loop(lstin): global con tem = [] for j in range(2,len(lstin)): for k in lst: if k[0] == lstin[j]: con = con+k[1] tem.append(k) lst.remove(k) return temn,m = map(int,input().split()) temlst,conlst,lst,sublst,gencon = [],[],[],[],[1] con = 0 for i in range(0,m): lst.append(list(map(int,input().strip().split()))) for i in range(0,len(lst)): if lst[i][0]==1: temlst = list(lst[i]) con = con + lst[i][1] del lst[i] break gencon.append(con) con = 0 index = 0 temlst = loop(temlst) gencon.append(con) con = 0 conlst = list(temlst) while len(lst)>0: if isinstance(conlst[0], list) and len(conlst)>0: conlst = loopone(conlst) gencon.append(con) con = 0 elif isinstance(conlst[0], int) and len(conlst)>0: conlst = loop(conlst) gencon.append(con) con = 0 elif len(conlst)==0: break ma = max(gencon) mindex = 0 for i in range(0,len(gencon)): if gencon[i]==ma: mindex = i+1 print(str(ma)+" "+str(mindex))