HDOJ 4039 (Data_Structure)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4039

       先给出很多朋友关系,然后找出谁和A有最多的共同朋友,并且此人和A不是朋友。比如A和C是朋友,B和C是朋友,所以要询问A的话,肯定输出B了。可能有多个,按字典序。

       因为string不好索引,我就用map了,先把键值放进去(自动排序),然后递增赋值(int)。用一个整型值作为string的代言人了。这样可以很方便的存放处理朋友关系。用一个二位数组存放朋友关系,比如A 和 D是朋友,A,D是1和4,则net[1][4]=true。初始化都是false。这样朋友关系网就建立了。

      比如要找与A有最多的共同朋友,所以这个人和A不是朋友(同过朋友关系网很好找),然后数他们有几个共同朋友,找出最多的,输出。

      思路那叫一个清晰啊!测试样例也是对的,一提交竟然超时了。为什么啊?求大神解惑!

 

超时代码:

#include <cstdio>
#include <iostream>
#include <map>
#include <iterator>
#include <cstdlib>
#include <cstring>
#define N 1001
using namespace std;

bool net[N][N];
map <string,int> m;
map <string,int>::iterator iter;

string s[N][2];
 
struct fri_num
{
  int id;
  int num;       
} fri[N];

int relation,query,f;

bool find_friend(string s,int n,int &f);
int inti();

int main()
{
  string a,b,q; 
  int T,i,j,k,value,max,cnt = 1;   
  bool success;
  //freopen("in.txt","r",stdin);
  //freopen("me.txt","w",stdout);
  
  scanf("%d",&T);
  
    do
    {
        
      value = inti();
         
       printf("Case %d:\n",cnt++);  
      
       while(query--)
       {
          cin>>q;
          
          success = find_friend(q,value,f);
        
          if(success)
          {           
              for(max = 0,i = 0 ; i < f ; ++i)
                if(fri[i].num > max)
                   max = fri[i].num;
              
              if(!max)
              {
                 puts("-"); goto loop;      
              }
          
               iter = m.begin();
               for(i = 0 ; i < f ; ++i)
               if( fri[i].num == max)
               {
                  for(; iter != m.end(); ++iter)
                     if(iter->second == fri[i].id)
                     {
                       cout<<iter->first<<" ";
                       break;                
                     }     
                     iter++;                   
               }
               
             printf("\n");    
          } 
          else
           puts("-"); 
           loop:;             
       }     
       
       
      m.clear();
     
    }while(--T);  
    
 // system("pause");
  return 0;
}
/*
   deal with the input
*/
int inti()
{
      int i,n;
      scanf("%d%d",&relation,&query);
      
      memset(net,false,sizeof(net));
    
      n = 0;  
      for(i = 0 ; i < relation ; ++i)
      {
          cin>>s[i][0]>>s[i][1];//用数组保存,下面要用 
          m[s[i][0]] = m[s[i][1]] = 0 ;  
      }   
      
      i = 0 ;   
      for(iter = m.begin();iter != m.end();++iter)
      {
         iter->second = i ;
         ++i;  
      }
      n = i;
      /*
       是朋友就赋值为 true 
      */
      for(i = 0 ; i < relation ;++i)
       net[ m[s[i][0]] ][m[ s[i][1]] ]  =  net[ m[ s[i][1]]][ m[s[i][0]] ] = true;      
     return n;
}
/*
  whether he can find a mutual friend
*/
bool find_friend(string s,int n,int &f)
{
     int i,j,k,tmp;
     bool succ = false;
     i = m[s];
     k = 0 ;
     f= 0 ;
     
        for(j = 0;j < n ;++j)
          if(j != i && !net[i][j])
          {
               tmp = 0;
               for(k = 0 ; k < n ; ++k)
                if(net[i][k] && net[j][k])
                {
                    succ = true;//找到共同朋友 
                    ++tmp;
                }
              
               fri[f].num = tmp;
               fri[f++].id = j;                
          }   
          
       return succ;
}

  

posted @ 2012-04-14 21:11  开开甲  阅读(137)  评论(0编辑  收藏  举报