1 /*
2 http://acm.hdu.edu.cn/showproblem.php?pid=4039
3 题意:给出至多一千个朋友关系,要求查询A的朋友的朋友C,且C与A不是朋友关系,C是所有满足条件的人中和A有相同好友最多的;
4 如果有多个C就输出多个,没有就输出-
5 思路:两层搜索,记录共同好友数即可
6 2017年02月26日19:11:01
7 */
8 #include <cstdio>
9 #include <map>
10 #include <string>
11 #include <cstring>
12 #include <iostream>
13 #include <vector>
14 #include <algorithm>
15 using namespace std;
16 map<string,int> mstoi;
17 map<int,string> mitos;
18 bool g[2010][2010];//i和j是否邻接
19 vector<string> res;
20 int v[4010];
21 int pre[4010];
22 int last[2010];
23 int num[2010];
24 int maxnum;//maxnum>0就是有结果
25 int nowid;//当前查询的 id
26 void dfsb(int id){
27 int now=last[id];
28 while(now){
29 if(!g[nowid][v[now]]){
30 num[v[now]]++;
31 if(num[v[now]]>maxnum){
32 maxnum=num[v[now]];
33 }
34 }
35 now=pre[now];
36 }
37 }
38 void dfsa(int id){
39 nowid=id;
40 memset(num,0,sizeof(num));
41 maxnum=0;
42 int now=last[id];
43 while(now){
44 dfsb(v[now]);
45 now=pre[now];
46 }
47 }
48 int main(){
49 //freopen("ina","r",stdin);
50 //freopen("outa","w",stdout);
51 int t;
52 scanf("%d",&t);
53 for(int tt=1;tt<=t;tt++){
54 printf("Case %d:\n",tt);
55 memset(last,0,sizeof(last));
56 memset(g,false,sizeof(g));
57 int n,q;
58 mstoi.clear();
59 mitos.clear();
60 string tmpsa,tmpsb;
61 int tmpia,tmpib;
62 scanf("%d %d",&n,&q);
63 int id=0;
64 for(int i=1;i<=n;i++){
65 cin>>tmpsa>>tmpsb;
66 tmpia=mstoi[tmpsa];
67 tmpib=mstoi[tmpsb];
68 if(!tmpia){
69 id++;
70 mstoi[tmpsa]=id;
71 tmpia=id;
72 mitos[id]=tmpsa;
73 g[id][id]=true;
74 }
75 if(!tmpib){
76 id++;
77 mstoi[tmpsb]=id;
78 tmpib=id;
79 mitos[id]=tmpsb;
80 g[id][id]=true;
81 }
82 v[i<<1]=tmpib;
83 pre[i<<1]=last[tmpia];
84 last[tmpia]=i<<1;
85 v[i<<1|1]=tmpia;
86 pre[i<<1|1]=last[tmpib];
87 last[tmpib]=i<<1|1;
88 g[tmpia][tmpib]=true;
89 g[tmpib][tmpia]=true;
90 }
91 for(int i=0;i<q;i++){
92 res.clear();
93 cin>>tmpsa;
94 tmpia=mstoi[tmpsa];
95 dfsa(tmpia);
96 if(maxnum){
97 for(int k=1;k<=id;k++){
98 if(num[k]==maxnum){
99 res.push_back(mitos[k]);
100 }
101 }
102 sort(res.begin(),res.end());
103 for(int k=0;k<res.size();k++){
104 if(k)printf(" ");
105 cout<<res[k];
106 }
107 printf("\n");
108 }else{
109 printf("-\n");
110 }
111 }
112 }
113 return 0;
114 }