华为笔试题目“最后几人知”

在通讯软件中,在群里面转发消息可以使得一条消息扩散到最多那里。假设已知有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 }

 

posted on 2019-08-21 21:27  逸阳  阅读(814)  评论(0编辑  收藏  举报

导航