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;
}
时间: 2024-12-23 11:32:06

Codeforces 245G Suggested Friends - 交集set_intersection()的相关文章

深度理解STL之map、set

课程设计做了这个一直没有整理(搬运 set算是关键字和相同的特殊map set应该更加被强调理解为"集合",而集合所涉及的操作并.交.差等,即STL提供的如交集set_intersection().并集set_union().差集set_difference()和对称差集set_symmetric_difference(),都需要进行大量的比较工作,那么使用底层是有序结构的红黑树就十分恰当了,这也是其相对hash结构的优势所在. Map是在红黑树基础上的Hash map,即存在唯一关键

#include&lt;algorithm&gt;

#include<algorithm>里的函数                                    转载▼ #include<algorithm>里的函数 #include<algorithm>   非修改性序列操作(12个)   循环 对序列中的每个元素执行某操作 for_each()   查找 在序列中找出某个值的第一次出现的位置 find()   在序列中找出符合某谓词的第一个元素 find_if()   在序列中找出一子序列的最后一次出现的位置

C++编程常用头文件及其包含函数汇总

1. #include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头文件. 当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现:当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std:这样才能正确使用cout.   2.#include <cstdlib>是C++里面的一个常用函数库, 等价于C中的<stdlib.h>

头文件algorithm中的常用函数

头文件algorithm中的常用函数 一.非修改性序列操作(12个) 循环         对序列中的每个元素执行某操作         for_each() 查找         在序列中找出某个值的第一次出现的位置         find() 在序列中找出符合某谓词的第一个元素     find_if() 在序列中找出一子序列的最后一次出现的位置         find_end() 在序列中找出第一次出现指定值集中之值的位置     find_first_of() 在序列中找出相邻的一对

#include&lt;algorithm&gt;里的函数

#include<algorithm>   非修改性序列操作(12个)   循环 对序列中的每个元素执行某操作 for_each()   查找 在序列中找出某个值的第一次出现的位置 find()   在序列中找出符合某谓词的第一个元素 find_if()   在序列中找出一子序列的最后一次出现的位置 find_end()   在序列中找出第一次出现指定值集中之值的位置 find_first_of()   在序列中找出相邻的一对值 adjacent_find()   计数 在序列中统计某个值出现

STL源码剖析——STL算法stl_algo.h

前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法,本文剖析STL其他的算法,例如排序算法.合并算法.查找算法等等.在剖析的时候,会针对函数给出一些例子说明函数的使用.源码出自SGI STL中的<stl_algo.h>文件.注:本文的源码非常多,可能后续博文会对这些算法进行归类分析. STL算法剖析 #ifndef __SGI_STL_INTERNAL_ALGO_H #define __SGI_STL_INTERNAL_ALGO_H #include <stl_heap

算法之美_源代码发布(10)

本文辑录了<算法之美--隐匿在数据结构背后的语言>(电子工业出版社2016年出版)一书第10章后半部分之代码(P358~P374).全文目录."45个算法"目录."22个经典问题目录",以及有奖捉虫活动详情请见如下链接:http://blog.csdn.net/baimafujinji/article/details/50484348 附录中的经典笔试.面试问题参考答案请见: http://blog.csdn.net/baimafujinji/artic

STL中set底层实现方式? 为什么不用hash?

红黑树与hash table最大的不同是,红黑树是有序结构,而hash table不是.但不是说set就不能用hash,如果只是判断set中的元素是否存在,那 么hash显然更合适,因为set 的访问操作时间复杂度是log(N)的,而使用hash底层实现的hash_set是近似O(1)的.然而,set应该更加被强调理解 为"集合",而集合所涉及的操作并.交.差等,即STL提供的如交集set_intersection().并集set_union().差集set_difference()和

【足迹C++primer】56、文本查询程序

/** * 功能:文本查询程序 * 时间:2014年7月23日10:26:09 * 作者:cutter_point */ #include<iostream> #include<algorithm> #include<memory> #include<set> #include<map> #include<fstream> #include<sstream> using namespace std; /* Alice Em