hdu 4039 暴力

思路:用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:\n",++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("\n");
        }
    }
    return 0;
}

 

posted @ 2013-08-22 19:02  fangguo  阅读(215)  评论(0编辑  收藏  举报