问题描述:现有一个社交网站,其好友推荐策略为:用户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
看了别人的代码,主要想法是哈希表的使用以及好友矩阵表。将名字字符串转化到int空间,然后使用好友矩阵表进行分析。特别注意:当有新的好友对产生时要继续进行循环
#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; //P:阈值m:人的个数M:增加知道好友关系的数量
//n查询某个用户的好友数量 N:查询指定用户是否是好友
while(cin>>P>>m>>M>>n>>N)
{
string str1,str2;
map<string,int>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;
//判断i和j的共同好友数量
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;
cout<<num[id[str1]]<<endl;
}
for(i = 0;i<N;i++)
{
cin>>str1>>str2;
if(mp[id[str1]][id[str2]])
cout<<"0"<<endl;
else
cout<<"-1"<<endl;
}
}
system("pause");
return 0;
}