一眼就看出是水题,相当清晰。但是比赛的时候RE了一次。应该是错在输入的名字总数上界应该是2*n 而不是n,把上界调大就A了。


代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
#include<string>
using namespace std;

#define MAXN 1010*2
vector<int> G[MAXN];
string a[MAXN];				//存名字
map<string, int>vis;
int num;
int n, m;

int vv[MAXN];		//访问标记
queue<int> q;


int addvec(string x)
{
	if(vis[x]) {return vis[x]; }
	else
	{
		vis[x] = num;	a[num++] = x;	return num-1;
	}
}

int getnum(string x) { return vis[x]; }

void clear()
{
	for(int i=0; i<=n*2; i++)	if(!G[i].empty())
	{
		G[i].clear();
	}
}

string ans[MAXN];
int cnt[MAXN];
int bfs(int x)
{
	int ansn=0;
	int find=0;
	memset(vv, 0, sizeof(vv));
	memset(cnt, 0, sizeof(cnt));
	vv[x] = 1;
	for(int i=0; i<(int)G[x].size(); i++)	if(!vv[G[x][i]])
	{
		int v = G[x][i];
		vv[v] = 1;
		q.push(v);
	}
	int maxx=0;
	while(!q.empty())
	{
		int u = q.front();	q.pop();
		for(int i=0; i<(int)G[u].size(); i++) if(!vv[G[u][i]])
		{
			int v = G[u][i];
			if(!cnt[v]) 
			{
				cnt[v]=1;
				maxx = max(maxx, cnt[v]);
				ans[ansn].clear();
				ans[ansn++] += a[v];
			}
			else
			{
				cnt[v]++;
				maxx = max(maxx, cnt[v]);
			}
			find = 1;
		}
	}
	sort(ans, ans+ansn);
	int flag=0;
	for(int i=0; i<ansn; i++)
	{
		if(cnt[getnum(ans[i])] != maxx) continue;
		if(flag) { cout<<" "; }
		flag=1;
		cout<<ans[i];
	}
	return find;
}

void solve()
{
	for(int i=0; i<m; i++)
	{
		string t;	cin>>t;
		if(bfs(getnum(t)))
		{
			cout<<endl;
		}
		else cout<<"-"<<endl;
	}
}

int main()
{
	int t;	cin>>t;
	for(int i=0; i<t; i++)
	{
		printf("Case %d:\n", i+1);
		
		num=1;
		if(!vis.empty()) vis.clear();
		clear();

		cin>>n>>m;
		for(int j=0; j<n; j++)
		{
			string t1, t2;
			cin>>t1>>t2;

			int u = addvec(t1);
			int v = addvec(t2);
			G[u].push_back(v);
			G[v].push_back(u);
		}
		solve();
	}
}