98pts wa#16 #32求调
查看原帖
98pts wa#16 #32求调
361592
histcat楼主2023/10/31 21:49

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;
}
2023/10/31 21:49
加载中...