Codeforces 245G Suggested Friends - 交集set_intersection()

一些人互相是朋友(无向图连一条无向边),现在要添加一个推荐朋友的功能,如果对于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;

}

 

你可能感兴趣的:(codeforces)