华为笔试题目“最后几人知”
在通讯软件中,在群里面转发消息可以使得一条消息扩散到最多那里。假设已知有m个群,其中一个人把一条消息发到他所在的群里面,这些群里面的每个人又把消息再次转发到他所有的群里面,请问所有群的所有人都转发过一次后,最后几个人收到该消息(包括发消息的人)?输出收到消息的人数(以十进制整数输出,不需要加换行符)
输入描述:
发第一条消息的人名
群组个数m
群组1成员人名列表
群组2成员人名列表
....
群组m成员人名列表
人名是英文字符串,包含英文字母和空格,最大长度不超过100字符。
群组个数m是十进制整数,最大不超过100。
群组成员人名列表包含1至多个人名,两个人名之间以逗号分隔。
输出描述:
以十进制输出最后能受到消息的人数。
示例:
输入:
Jack
3
Jack,Tom,Anny,Lucy
Tom,Danny
Jack,Lily输出:
6
思路:
先统计所有人名所在的组号,然后按照BFS去遍历;(注意只有Jack一个人一组,而没有包含在其他组的情况,这时候应该输出1)
1 #include <iostream> 2 #include <vector> 3 #include <bits/stdc++.h> 4 using namespace std; 5 6 vector<string> pro(string& str){ 7 vector<string> res; 8 int index =0; 9 for(int i=0;i<str.size(); i++){ 10 if(str[i]==','){ 11 res.push_back(str.substr(index, i-index) ); 12 index = i+1; 13 } 14 } 15 if(index<str.size()){ 16 res.push_back(str.substr(index)); 17 } 18 return res; 19 } 20 21 int main(){ 22 string name; 23 while(cin>>name){ 24 int m; 25 cin>>m; 26 27 string cur; 28 vector<vector<string> > data; 29 for(int i=0; i<m; i++){ 30 cin>>cur; 31 data.push_back( pro(cur ) ); 32 } 33 34 map<string, vector<int> > exist; 35 36 for(int i=0;i<data.size(); i++){ 37 for(int j=0; j<data[i].size();j++ ){ 38 exist[ data[i][j] ].push_back(i) ; 39 } 40 } 41 42 queue<int> temp; 43 for(int i=0; i<exist[name].size(); i++){ 44 temp.push( exist[name][i] ); 45 } 46 47 vector<int> visited(m,0); 48 set<string> res; 49 res.insert(name); 50 51 while(!temp.empty()){ 52 int cur = temp.front(); 53 temp.pop(); 54 visited[cur] = 1; 55 for(int i=0; i<data[cur].size(); i++){ 56 for(int j=0; j< exist[ data[cur][i] ].size(); j++ ){ 57 if( !visited[ exist[ data[cur][i] ][j] ] ) { 58 temp.push( exist[ data[cur][i] ][j] ); 59 } 60 } 61 res.insert( data[cur][i] ); 62 } 63 } 64 cout<<res.size(); 65 } 66 }