rt,感谢 https://www.luogu.com.cn/record/132684651
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int G[N][N];
int n;
vector <int> g[N];
int color[N];
vector <int> block[N][5];
int bcnt;
bool f[N][N];//能否在前i个连通块内 在A组中放入j个人
int path[N][N];
int belong[N];
int main()
{
// ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
int k;
for(int i = 1;i <= n;i++)
{
while(1)
{
cin >> k;
if(k != 0)
{
G[i][k] = 1;
}
else
{
break;
}
}
}
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
if(i == j) continue;
if(G[i][j] == 0 || G[j][i] == 0)
{
g[i].emplace_back(j);
}
}
}
function<void(int, int)> bfs = [&](int be, int star)
{
color[be] = 1;
queue <int> qwq;
qwq.push(be);
while(qwq.size())
{
int t = qwq.front();
block[bcnt][color[t]].emplace_back(t);
qwq.pop();
for(auto v : g[t])
{
if(color[v] != 0)
{
if(color[v] == color[t])
{
cout << "No solution";
exit(0);
}
else
{
continue;
}
}
else
{
color[v] = 3 - color[t];
qwq.push(v);
}
}
}
};
for(int i = 1;i <= n;i++)
{
if(color[i] == 0)
{
bcnt++;
bfs(i, bcnt);
}
}
f[0][0] = 1;
for(int i = 1;i <= bcnt;i++)
{
for(int j = 1;j <= (n >> 1);j++)
{
if(path[i][j]) continue;
if(j - block[i][1].size() >= 0 && f[i - 1][j - block[i][1].size()])
{
f[i][j] = 1;
path[i][j] = 1;
}
if(j - block[i][2].size() >= 0 && f[i - 1][j - block[i][2].size()])
{
f[i][j] = 1;
path[i][j] = 2;
}
}
}
int ans = 0x3f3f3f3f;
int q = 0;
for(int i = 1;i <= (n >> 1);i++)
{
if(f[bcnt][i])
{
if(n - 2 * i < ans)
{
ans = n - 2 * i;
q = i;
}
}
}
// cout << ans << "\n";
// vector aannss<int> qwq;
function<void(int, int)> print = [&](int i, int j)
{
if(i == 0) return;
print(i - 1, j - block[i][path[i][j]].size());
for(auto t : block[i][path[i][j]])
{
belong[t] = 1;
}
};
print(bcnt, q);
cout << q << " ";
for(int i = 1;i <= n;i++)
{
if(belong[i] == 1) cout << i << " ";
}
cout << "\n";
cout << n - q << " ";
for(int i = 1;i <= n;i++)
{
if(belong[i] == 0) cout << i << " ";
}
// cout << ans;
return 0;
}