zoukankan      html  css  js  c++  java
  • Codeforces 245G Suggested Friends

    一些人互相是朋友(无向图连一条无向边),现在要添加一个推荐朋友的功能,如果对于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
    ",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;
    }
  • 相关阅读:
    超级管理员登录后如果连续XX分钟没有操作再次操作需要重新登录
    linux下连接本地的navicate
    linux 日常中会用到的命令(持续更新)
    关于PHP的 PHP-FPM进程CPU 100%的一些原因分析和解决方案
    VMware Workstation 14 激活码
    破解phpstorm
    redis五种数据类型的使用场景
    关于Nginx负载均衡的6种策略
    PHP和PHP-FPM 配置文件优化
    redis配置文件详解
  • 原文地址:https://www.cnblogs.com/zhyfzy/p/4298198.html
Copyright © 2011-2022 走看看