zoukankan      html  css  js  c++  java
  • 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;
    }
    

  • 相关阅读:
    采用重写tostring方法使ComboBox显示对象属性
    JavaScript中正则表达式test()、exec()、match() 方法
    高级软件工程实践总结作业
    用户使用调查报告
    Beta阶段置顶集合
    Beta冲刺阶段总结随笔
    Beta冲刺Day7
    Beta冲刺Day6
    Beta冲刺Day5
    Beta冲刺Day4
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4006217.html
Copyright © 2011-2022 走看看