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;
}