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; }