/* 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"); } } }