一眼就看出是水题,相当清晰。但是比赛的时候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();
}
}
浙公网安备 33010602011771号