描述
現有一個社交網站,其好友推薦策略爲:
用戶A和用戶B不是好友,當二人的共同好友數量超過好友推薦閾值m(可配置)時,就向A和B分別推薦爲彼此好友。
任務爲:
不使用STL和Mapreduce,
對設定的m值,給定一組用戶及各自好友列表,對這一組用戶,反覆自動應用上述好友推薦策略後(假設每次推薦都被採納),求指定用戶的最終好友列表。
要求算法複雜度不高於O(n^2),用戶總數規格不受限;
注:好友關係是雙向的,即:如果用戶A是用戶B的好友,那麼用戶B一定也是用戶A的好友。
分析
HASH. 將好友數小的那個人的朋友插入HASH表中,然後遍歷另外一個人的好友,在HASH表中進行查詢。
Code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2000;
const int mod = 1997;
int AF[maxn];
int BF[maxn];
struct HASH{
int a[maxn];
int head[maxn];
int next[maxn];
int sz;
void init(){
memset(head,-1,sizeof(head));
sz=0;
}
bool find(int val){
int tmp = (val%mod+mod)%mod;
for(int i=head[tmp];i!=-1;i=next[i]){
if(val==a[i])
return true;
}
return false;
}
void insert(int val){
int tmp = (val%mod+mod)%mod;
if(find(val))
return;
a[sz]=val;
next[sz]=head[tmp];
head[tmp]=sz++;
}
}h;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<n;i++){
scanf("%d",AF+i);
}
for(int i=0;i<m;i++){
scanf("%d",BF+i);
}
int commonfriend = 0;
h.init();
if(n<m){
for(int i=0;i<n;i++){
h.insert(AF[i]);
}
for(int i=0;i<m;i++){
if(h.find(BF[i]))
commonfriend++;
}
}
else{
for(int i=0;i<m;i++){
h.insert(BF[i]);
}
for(int i=0;i<n;i++){
if(h.find(AF[i]))
commonfriend++;
}
}
printf("ans = %d\n",commonfriend);
}
return 0;
}