1. 程式人生 > >華為機試題 好友關係管理

華為機試題 好友關係管理

好友關係管理
描述:

現有一個社交網站,其好友推薦策略為:使用者A和使用者B不是好友,當二人的共同好友數量超過好友推薦閾值m時,就向AB分別推薦為彼此好友。

本題任務為:對設定的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");
		}
	}
}