分析:直接暴力讨论极端情况,如果只有一个队友,那么我无论如何也是要选的,即使不满足题意,所以对于NO的条件就是,在每组中只有一个队友且它的出现次数超过上限 , 剩下的就是在每组中贪心找最小值输出即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
vector<ll> ans[N];
ll add[N];
//ll sum[N];
int main()
{
int t;
cin >> t;
while (t --)
{
memset (add , 0 , sizeof add);
//memset (sum , 0 , sizeof sum);
ll n , m , flag = 0;
cin >> n >> m;
for (int i = 1; i <= m; i ++ ) ans[i].clear();
for (int i = 1; i <= m; i ++ )
{
ll k;
cin >> k;
for (int j = 1; j <= k; j ++ )
{
ll x;
cin >> x;
ans[i].push_back(x);
}
if (k == 1) add[ans[i][0]] ++;
if (add[ans[i][0]] > (m + 1) / 2) flag = 1;
}
if (flag)
{
cout << "NO" << endl;
continue;
}
else
{
cout << "YES" << endl;
for (int i = 1; i <= m; i ++ )
{
int maxv = ans[i][0];
if (ans[i].size() == 1)
{
cout << ans[i][0] << " ";
continue;
}
else
{
for (int j = 0; j < ans[i].size(); j ++ )
{
if (add[ans[i][j]] < add[maxv]) maxv = ans[i][j];
}
cout << maxv << " ";
add[maxv] ++;
}
}
cout << endl;
}
}
return 0;
}