• 36th成都区域赛网络赛 hdoj4039 The Social Network(建图+字符串处理)



    这题是某年成都区域赛网络赛的一题。

            这题思路非常easy,可是从时间上考虑,不妨不要用矩阵存储,我用的链式前向星。

            採用线上查询。利用map对字符串编号,由于非常方便。要推荐的朋友,事实上就是朋友的朋友(这里指的是直接朋友,图中即指有直接边相连的)。

            所以在寻找时,仅仅须要查找朋友的朋友,并计数。

            注意:在输出时不能有对于的空格。         

          

     附代码:

       

    #include<iostream>
    using namespace std;
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<map>
    #include<algorithm>
    
    int n,m;
    char s11[20],s22[20];
    string g[20100],l[20100];
    int next[201000],head[2010],key[201000];
    int num;
    
    void add(int u,int v)
    {
         key[num]=v;
         next[num]=head[u];
         head[u]=num++;
    }
    
    
    int main()
    {
        int T,pp=0;
        scanf("%d",&T);
        while (T--)
        {
        map<string,int> hash;
        int n,m,i,j,k;      
        string s1,s2;
        int cnt=0;
        
        num=0;
    
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));
        
        for (i=0;i<n;++i)
            {
            scanf("%s%s",s11,s22);
            s1=string(s11);
            s2=string(s22);
            if (hash[s1]==0)
               hash[s1]=++cnt,l[cnt]=s1;
            if (hash[s2]==0)
               hash[s2]=++cnt,l[cnt]=s2;
            
            add(hash[s1],hash[s2]);
            add(hash[s2],hash[s1]);
            }
        printf("Case %d:
    ",++pp);    
            
        for (i=0;i<m;++i)
            {
            scanf("%s",s11);
            s1=string(s11);
            int p=hash[s1];
            int f[20100],flag[20010];
            memset(f,0,sizeof(f));
            memset(flag,0,sizeof(flag));
            
            for (k=head[p];k!=-1;k=next[k]) flag[key[k]]=-1;
            
            for (k=head[p];k!=-1;k=next[k])  
                if (key[k]!=p)
                {
                   for (j=head[key[k]];j!=-1;j=next[j])
                       if (key[j]!=key[k] && key[j]!=p && flag[key[j]]==0)
                       {
                          f[key[j]]++;
                       }
                }
            int Max=-1;
            for (k=1;k<=cnt;++k) 
                {
                Max=max(Max,f[k]);
              //  printf("%d
    ",f[k]);
                }
            if (Max==0)
               {
               printf("-
    ");
               continue;
               }
            int q=0;
            for (k=1;k<=cnt;++k)
                if (Max==f[k])
                   {
                   g[q++]=l[k];
                   }
            sort(g,g+q);       
            for (k=0;k<q-1;++k)  cout << g[k] << " ";
            cout << g[q-1];
            cout << endl;
            }    
        
        }
    
        return 0;
    }
    

  • 相关阅读:
    【小工具】根据定义的白名单字段进行Bean的拷贝
    【Java】Java8的Lambda入门记录
    【Java】浅谈Java IO
    【工具】我的Git学习日志
    【Java】浅谈HashMap
    【Java】Java Queue的简介
    【ZooKeeper】ZooKeeper入门流水记
    【MQTT】Mosquitto的安装与使用流水记
    【数据结构】简单的数据结构图解
    【Java多线程】JDK1.5并发包API杂谈
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4006217.html
Copyright © 2020-2023  润新知