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 }