HDU 4039

  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 }

 

posted @ 2017-03-01 19:06  boom~  阅读(147)  评论(0编辑  收藏  举报