题目: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;
}