啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
查看原帖
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
519384
Link_Cut_Y楼主2022/5/14 17:54

rt,本来觉得是一道水题,结果写了半天都不出结果。。。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <unordered_map>

using namespace std;

const int N = 1 << 21;
int f[N], n;
int h[N], e[N], ne[N], idx;
bool Map[N];
int pre[N];
void add(int a, int b)
{
	e[ ++ idx] = b, ne[idx] = h[a], h[a] = idx;
}

int get_state(int state, int u)
{
	state ^= (1 << u);
	
	for (int i = h[u]; i; i = ne[i])
	{
		int j = e[i];
		if (u != j) state ^= (1 << j);
		for (int k = h[j]; k; k = ne[k])
			if (j != e[k]) state ^= (1 << e[k]);
	}
	
	return state;
}

void print(int u)
{
	if (pre[u] != -1) u = pre[u];
	cout << u << ' ';
}

int main()
{
	scanf("%d", &n);
	memset(pre, -1, sizeof pre);
	
	for (int i = 0; i < n; i ++ )
	{
		int m;
		scanf("%d", &m);
		
		while (m -- )
		{
			int b;
			scanf("%d", &b);
			add(i, b - 1);
		}
	}
	
	queue<int> q;
	q.push(0);
	Map[0] = true;
	
	while (q.size())
	{
		int state = q.front();
		q.pop();
		
		for (int i = 0; i < n; i ++ )
		{
			int t = get_state(state, i);
			if (Map[t]) continue;
			Map[t] = true;
			f[t] = f[state] + 1;
			pre[t] = state;
			if (t == (1 << n) - 1) 
			{
				print(t);
				return printf("%d\n", f[t]) & 0;
			}
			q.push(t);
		}
	}
	
	return puts("Change an alarm clock,please!"), 0;
}
2022/5/14 17:54
加载中...