hdu 4039 The Social Network

/*
http://acm.hdu.edu.cn/showproblem.php?pid=4039
题意:给出N对好友关系,之后Q次提问,问可以对该用户推荐的相识度最高的好友;
推荐好友满足的条件:该用户的所有好友的好友中,出现次数最多的,
而且推荐好友本身不是该用户的好友;若有多个推荐好友时,按字典序输出;
一道悲剧的题啊*/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 2500
#include<iostream>
#include<algorithm>
using namespace std;
char str[N][20],out[N][20];
int map[N][N],k,max1,num[N];
int find(char c[])
{
    int i;
    for(i=0;i<k;i++)
    {
        if(strcmp(c,str[i])==0)
        {
            return i;
        }
    }
    strcpy(str[i],c);
    k++;
    return i;
}
int search(int x)
{
    max1=-1;

    int i,j;
    for(i=0;i<k;i++)//以前做时  暴力枚举有共同的好友最多的人 ,不知为嘛tle 悲剧
    {

        if(map[x][i]==1)
        for(j=0;j<k;j++)
        {
            if(map[x][j]==0&&map[i][j]==1&&x!=j)
            {
                num[j]++;
                if(max1<num[j])max1=num[j];
            }
        }

    }
    return max1;
}
int cmp(const void *a, const void *b)
{
    return strcmp( (char *)a, (char *)b );
}

int main()
{
    int T,l,n,q,i;
    char a[20],b[20];
    scanf("%d",&T);
    for(l=1;l<=T;l++)
    {
        k=0;
        scanf("%d%d",&n,&q);
        getchar();
        memset(map,0,sizeof(map));
        for(i=0;i<n;i++)
        {
            scanf("%s%s",a,b);
            int x=find(a);
            int y=find(b);
            map[x][y]=map[y][x]=1;

        }
        printf("Case %d:\n",l);
        while(q--)
        {
            scanf("%s",a);
            memset(num,0,sizeof(num));
            int x=find(a);
            max1=search(x);
            //printf("%d\n",max1);
            if(max1==-1)
            {
                printf("-\n");
                continue;
            }
            int len=0;
            for(i=0;i<k;i++)
            {
                if(max1==num[i])
                {
                    strcpy(out[len++],str[i]);
                }
            }
            qsort(out,len,sizeof(out[0]),cmp);
            for(i=0;i<len;i++)
            {
               printf("%s",out[i]);
               if(i!=len-1)printf(" ");
            }
            printf("\n");

        }
    }
}

  

原文地址:https://www.cnblogs.com/acSzz/p/2435278.html