hdu 4039 The Social Network

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

题目分类:字符串+bfs

题意:给一个人际关系图,根据关系图,给一个人推荐一个人认识

题目分析

根据样例画出的关系图

代码:

 

#include<bits/stdc++.h>

using namespace std;

const int N=1010;

map<string,int>mp;
vector<int>G[N*2];
vector<string> ans;

char s1[20];
char s2[20];
char ss[20];

char s[N*2][20];
int Stack[N*2];
int vis[N*2];

bool bfs(int u)
{
    memset(vis,0,sizeof(vis));
    vis[u]=-1;
    queue<int>q;
    for(int i=0;i<G[u].size();i++)
    {
        q.push(G[u][i]);
        vis[G[u][i]]=-1;
    }
    int siz=-2;
    int company=0;
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        for(int i=0;i<G[u].size();i++)
        {
            int v=G[u][i];
            if(vis[v]==-1) continue;
            vis[v]++;
            if(siz<vis[v])
            {
                siz=vis[v];
                company=1;
                Stack[0]=v;
            }
            else if(siz==vis[v])
            {
                Stack[company++]=v;
            }
        }
    }
    if(siz<0) return false;
    ans.clear();

    for(int i=0;i<company;i++)
        ans.push_back(s[Stack[i]]);
    sort(ans.begin(),ans.end());

    for(int i=0;i<ans.size();i++)
    {
        cout<<ans[i];
        if(i<ans.size()-1)
            printf(" ");
    }
    printf("\n");
    return true;
}

int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif

    int t,n,m;
    scanf("%d",&t);
    for(int kase=1;kase<=t;kase++)
    {
        mp.clear();
        scanf("%d %d",&n,&m);
        for(int i=1;i<=2*n;i++)
            G[i].clear();
        int top=0;
        int num1,num2;
        while(n--)
        {
            scanf("%s %s",s1,s2);
            if(mp.find(s1)==mp.end())
            {
                mp[s1]=++top;
                memcpy(s[top],s1,sizeof s1);
                num1=top;
            }
            else
                num1=mp.find(s1)->second;

            if(mp.find(s2)==mp.end())
            {
                mp[s2]=++top;
                memcpy(s[top],s2,sizeof s2);
                num2=top;
            }
            else
                num2=mp.find(s2)->second;

            G[num1].push_back(num2);
            G[num2].push_back(num1);
        }
        printf("Case %d:\n",kase);
        while(m--)
        {
            scanf("%s",ss);
            int i=mp.find(ss)->second;
            if(bfs(i)==false)
                puts("-");
        }
    }
    return 0;
}

 

posted @ 2015-11-13 00:02  Gssol  阅读(207)  评论(0编辑  收藏  举报