码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 245G Suggested Friends - 交集set_intersection()

时间:2015-02-23 19:01:14      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://www.cnblogs.com/zhyfzy/p/4298198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!