题目
思路
题目很简单,但是当时没大有时间了所以做的很赶,一直改来改去最后才提交上,一定要注意格式
需要注意几个问题:
- 5位数,所以fa数组要大一些
- 11111,33333,55555的fa就是自己,单独判断处理
- 同一个人被查询多次,处理方式与上面类似,用一个vis数组即可
- 只有一个人的时候,不属于任何圈子,单独判断
- 00000的输出格式为 p r i n t f ( " printf("%05d", v[i]); printf("
- 空格的处理和回车的处理
代码
#include <bits/stdc++.h>
#define maxx 101000
using namespace std;
int n, m;
int fa[maxx];
int vis[maxx];
int vv[maxx];
vector<int> v;
int find(int x)
{
if (fa[x] != x)
fa[x] = find(fa[x]);
return fa[x];
}
void merge(int x, int y)
{
int fx = find(x);
int fy = find(y);
if (fx != fy)
fa[fy] = fx;
}
int main()
{
for (int i = 0; i < 100010; ++i)
{
fa[i] = i;
}
cin >> n;
while (n--)
{
int x;
cin >> x;
int a;
cin >> a;
if (x != 1)
vv[a] = 1;
x--;
while (x--)
{
int b;
cin >> b;
merge(a, b);
}
}
cin >> m;
memset(vis, 0, sizeof vis);
while (m--)
{
int t;
cin >> t;
if (vis[t] == 0)
{
v.push_back(t);
// cout<<t<<' ';
vis[t] = 1;
}
}
int f = 0;
int kk = 0;
for (int i = 0; i < v.size(); ++i)
{
if (fa[v[i]] == v[i] && vv[v[i]] != 1) //注意这里空格的处理,一开始直接就用了i!=v.size(),格式错误
{
if (kk == 0)
{
printf("%05d", v[i]);
kk = 1;
}
else
printf(" %05d", v[i]);
f = 1;
}
}
if (f == 0)
cout << "No one is handsome" << endl;
else
cout << endl;
return 0;
}