思路:用map将每个字符串与一个数字进行对应,然后暴力统计就好了
#include<cstring> #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<map> #include<vector> #include<string> #define Maxn 2010 using namespace std; int fr[Maxn][Maxn],mul[Maxn][Maxn],Max[Maxn]; char str[Maxn][20]; map<string,int> g; vector<int> head[Maxn*2]; vector<int> ans[Maxn*2]; int cmp(int a,int b) { return strcmp(str[a],str[b])<0; } int main() { int t,n,q,i,j,k,Case=0,u,v; scanf("%d",&t); char s1[20],s2[20]; while(t--) { memset(fr,0,sizeof(fr)); memset(mul,0,sizeof(mul)); memset(Max,0,sizeof(Max)); g.clear(); scanf("%d%d",&n,&q); for(i=0;i<=2*n;i++) head[i].clear(),ans[i].clear(); int cnt=0; for(i=1;i<=n;i++) { scanf("%s %s",&s1,&s2); if(!g[s1]){ g[s1]=++cnt; strcpy(str[cnt],s1); } if(!g[s2]){ g[s2]=++cnt; strcpy(str[cnt],s2); } u=g[s1],v=g[s2]; head[u].push_back(v); head[v].push_back(u); fr[u][v]=fr[v][u]=1; } int sz; for(i=1;i<=cnt;i++){ sz=head[i].size(); for(j=0;j<sz;j++){ u=head[i][j]; int ss=head[u].size(); for(k=0;k<ss;k++){ v=head[u][k]; if(!fr[i][v]&&i!=v) mul[i][v]++,Max[i]=max(Max[i],mul[i][v]); } } } for(i=1;i<=cnt;i++){ for(j=1;j<=cnt;j++){ if(j==i) continue; if(mul[i][j]==Max[i]&&Max[i]) ans[i].push_back(j); } sort(ans[i].begin(),ans[i].end(),cmp); } printf("Case %d: ",++Case); //cout<<q<<endl; for(i=1;i<=q;i++){ scanf("%s",s1); u=g[s1]; if(ans[u].empty()) printf("-"); else{ sz=ans[u].size(); v=ans[u][0]; printf("%s",str[v]); for(j=1;j<sz;j++){ v=ans[u][j]; printf(" %s",str[v]); } } printf(" "); } } return 0; }