一些人互相是朋友(无向图连一条无向边),现在要添加一个推荐朋友的功能,如果对于x,有y,x与y不是朋友,但是y和x有共同的朋友,并且共同的朋友最多,那么y可以推荐给x。问对于每一个人,有多少人值得推荐。
map映射后建图,然后用set_intersection()求交集
这道题学习了一下set_intersection()的用法:
set_intersection( fir.begin() , fir.end() , sec.begin() , sec.end() , thr.begin() );
fir、sec、thr都是vector类型,当然也可以是int[]类型
要求fir和sec都是有序的,否则会出现错误。
sort(fir.begin(),fir.end());
该函数返回值为交集的尾指针,就是类似于thr.end()的概念。
这道题就对每个人求其他人的交集,计算出交集中有多少人即可。
#include<bits/stdc++.h> #define eps 1e-9 #define ALL(x) x.begin(),x.end() #define INS(x) inserter(x,x.begin()) #define FOR(i,j,k) for(int i=j;i<=k;i++) #define MAXN 1005 #define MAXM 40005 #define INF 0x3fffffff using namespace std; typedef long long LL; int i,j,k,n,m,x,y,T,ans,big,cas,num,len,an,bn,ans_num,cur; bool flag; map <string,int> mp; vector <int> st[10002]; int vis[10002]; int tmp[10002]; string a,b,rev[10002]; int main() { scanf("%d",&n); for (i=1;i<=n;i++) st[i].clear(); mp.clear(); memset(tmp,0,sizeof(tmp)); num=0; an=bn=0; ans_num=0; cur=0; ans=0; for (i=1;i<=n;i++) { cin>>a>>b; if (!mp.count(a)) { mp[a]=++num; rev[num]=a; an=num; }else an=mp[a]; if (!mp.count(b)) { mp[b]=++num; rev[num]=b; bn=num; }else bn=mp[b]; st[an].push_back(bn); st[bn].push_back(an); } for (i=1;i<=num;i++) { sort(st[i].begin(),st[i].end()); } printf("%d\n",num); for (i=1;i<=num;i++) { int pre=0; cur=0;ans=0;ans_num=0; memset(vis,0,sizeof(vis)); for (vector <int> ::iterator it=st[i].begin();it!=st[i].end();it++) { vis[*it]=1; } vis[i]=1; for (j=1;j<=num;j++) { if (vis[j]) continue; cur=set_intersection(st[i].begin(),st[i].end(),st[j].begin(),st[j].end(),tmp)-tmp; if (cur>ans_num) { ans_num=cur; ans=1; }else if (cur==ans_num) { ans++; } } cout<<rev[i]<<" "<<ans<<endl; } return 0; }
时间: 2024-12-23 11:32:06