華為機試題 好友關係管理
阿新 • • 發佈:2019-01-21
好友關係管理 | |
描述: |
現有一個社交網站,其好友推薦策略為:使用者A和使用者B不是好友,當二人的共同好友數量超過好友推薦閾值m時,就向A和B分別推薦為彼此好友。 本題任務為:對設定的m值,給定一組使用者及各自好友列表,對這一組使用者,反覆自動應用上述好友推薦策略後(假設每次推薦都被採納),求指定使用者的最終好友列表。 注:好友關係是雙向的,即:如果使用者A是使用者B的好友,那麼使用者B一定也是使用者A的好友。 寫一個程式,在社交網路中實現: 1)初始化社交網路 2)建立使用者 3)增加指定兩個使用者之間的好友關係 4)反覆自動應用好友推薦策略後,獲取某個使用者的好友數量 5 說明: 1、一個使用者有且只有一個名字,且不存在重名 2、自己和自己不存在好友關係 3、使用者名稱字大小寫敏感 4、使用者名稱字字串長度範圍為[1..20] 5、使用者總數小於100個 |
執行時間限制: | 無限制 |
記憶體限制: | 無限制 |
輸入: |
五個整數,好友推薦閾值P,建立使用者數量m,增加指定兩個使用者之間的好友關係數量M,查詢某個使用者的好友數量n,查詢指定兩個使用者是否是好友N字串,每個資料一行,按到上面的順序依次輸入資料,共m+M+n+N行字串 字串,每個一行,共m+M+n+N行字串 |
輸出: |
輸出使用者的好友數量,共n個,每個一行;如果使用者不存在,輸出-1,否則輸出好友數量。樣例中的使用者Jack、Peter、Tom的好友數量都是2個。 輸出指定兩個使用者是否是好友,共N個,每個一行,如果是輸出0,否則輸出-1。樣例中的使用者Jack與Peter、Peter與Tom、Jack與Tom都是好友關係,所有輸出0。 |
樣例輸入: |
2 3 3 3 3 //好友推薦閾值2,使用者數量為3,增加知道兩個使用者之間的好友關係數量M, //查詢某個使用者的好友數量3,查詢指定兩個使用者是否是好友N字串 Jack Peter Tom //輸入了三個使用者 Jack Peter Peter Tom Jack Tom //增加了三個好友關係 Jack Peter Tom //查詢了這三個使用者的好友數量 Jack Peter Peter Tom Jack Tom //查詢了這三個好友關係是否存在 樣例輸出: |
樣例輸出: | 2 //Jack幾個好友,這裡就用到了閾值2 //Peter幾個好友2 0 //Jack Peter是否好友0 //Peter Tom是否好友0 //Jack Tom是否好友 |
#include<iostream>
#include<string>
#include<map>
using namespace std;
const int maxn = 1010;
bool mp[maxn][maxn]; // mp[i][j] 表示 i 和 j 是否為好友
int num[maxn]; // num[i] 表示第 i 個人有多少個好友
int main(){
int P, m, M, n, N, i, j, k;
scanf("%d %d %d %d %d", &P, &n, &N, &m, &M);
string str1, str2;
map<string, int> id; // 名字轉化為id
for(i = 0; i < m; ++i){
cin >> str1;
id[str1] = i;
}
for(i = 0; i < M; ++i){
cin >> str1 >> str2;
mp[id[str1]][id[str2]] = mp[id[str2]][id[str1]] = 1;
}
bool flag = 1; // 表示是否會有新的好友對產生
int count; // 共同好友的個數
while(flag){
flag = 0;
for(i = 0; i < m; ++i){
for(j = i + 1; j < m; ++j){
if(mp[i][j]){
continue;
}
count = 0;
for(k = 0; k < m; ++k){
if(k == i || k == j){
continue;
}
if(mp[i][k] && mp[k][j]){
++count;
}
}
if(count > P){
mp[i][j] = mp[j][i] = 1;
flag = 1; // 有新的好友對產生,需要再次處理
}
}
}
}
// 統計每個人的好友個數
for(i = 0; i < m; ++i){
for(j = 0; j < m; ++j){
if(mp[i][j]){
++num[i];
}
}
}
for(i = 0; i < n; ++i){
cin >> str1;
printf("%d\n", num[id[str1]]);
}
for(i = 0; i < N; ++i){
cin >> str1 >> str2;
if(mp[id[str1]][id[str2]]){
printf("0\n");
}else{
printf("-1\n");
}
}
}