题目大意
现在有一个
N
个点
N≤22
M≤N∗(N−1)2
解题思路
不存在有向环,即操作后的图要是一幅
Dag
。回想一下
Dag
的性质,即只能拓扑序小的向拓扑序大的点连边。那么我们设
F[s]
表示状态为
s
(一个二进制)的点形成一个
程序
//YxuanwKeith
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 25, MAXM = (1 << 25) + 5;
int N, M, R[MAXN], F[MAXM];
int main() {
freopen("data.in", "r", stdin), freopen("data.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 1; i <= M; i ++) {
int u, v;
scanf("%d%d", &u, &v);
R[u] = R[u] | (1 << (v - 1));
}
memset(F, 200, sizeof F);
F[0] = 0;
int Lim = (1 << N) - 1;
for (int i = 0; i < Lim; i ++) {
for (int j = 1; j <= N; j ++) {
int Num = 1 << (j - 1);
if (i & Num) continue;
F[i | Num] = max(F[i | Num], F[i] + __builtin_popcount(R[j] & i));
}
}
printf("%d\n", M - F[Lim]);
}