题意
给出
2⋅N(0≤N≤9)
个宝石,其中
N
个属性为阴,另外
题解
由于
N
很小,枚举阴性宝石的排列。对于每一个排列,以每两颗阴性宝石中间位置当做一个点,产生
代码
/****************************************\
* Author : ztx
* Title :
* ALG :
* CMT :
* Time :
\****************************************/
#include <cstdio>
#define Rep(i,l,r) for(i=(l);i<=(r);i++)
#define rep(i,l,r) for(i=(l);i< (r);i++)
#define Rev(i,r,l) for(i=(r);i>=(l);i--)
#define rev(i,r,l) for(i=(r);i> (l);i--)
typedef long long ll ;
int CH , NEG ;
template <typename TP>inline void read(TP& ret) {
ret = NEG = 0 ; while (CH=getchar() , CH<'!') ;
if (CH == '-') NEG = true , CH = getchar() ;
while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
if (NEG) ret = -ret ;
}
template <typename TP>inline void readc(TP& ret) {
while (ret=getchar() , ret<'!') ;
while (CH=getchar() , CH>'!') ;
}
template <typename TP>inline void reads(TP *ret) {
ret[0]=0;while (CH=getchar() , CH<'!') ;
while (ret[++ret[0]]=CH,CH=getchar(),CH>'!') ;
ret[ret[0]+1]=0;
}
#include <cstring>
#include <algorithm>
#define maxn 15LL
#define maxm 100LL
int n , m ;
bool aft[maxn][maxn] ;
int per[maxn] ;
int yx[maxn] ;
bool vis[maxn] ;
bool g[maxn][maxn] ;
bool augment(int u) {
for (int v = 1 ; v <= n ; v ++ )
if (!vis[v] && g[u][v])
if (vis[v]=true , !yx[v] || augment(yx[v]))
return yx[v] = u , true ;
return false ;
}
int main() {
int i , j , u , v , ans , ANS ;
/// #define READ
#ifdef READ
freopen(".in" ,"r",stdin ) ;
freopen(".out","w",stdout) ;
#endif
while (scanf("%d%d", &n, &m) != EOF) {
if (!n || !m) {
puts("0") ; continue ;
}
if (n == 1) {
rep (i,0,m)
read(u) , read(v) ;
puts("1") ; continue ;
}
memset(aft,0,sizeof aft) ;
rep (i,0,m)
read(u) , read(v) , aft[v][u] = true ;
per[1] = n ; Rep (i,2,n) per[i] = i-1 ;
ANS = n ;
do {
per[0] = per[n] ;
memset(g,0,sizeof g) ;
Rep (i,1,n) yx[i] = 0 ;
Rep (i,1,n) /// Yin 's gap
Rep (j,1,n) /// Yang
if (!aft[per[i-1]][j] && !aft[per[i]][j])
g[i][j] = true ; /// Add Edge from Yin's gap to Yang's germ
ans = n ;
Rep (i,1,n) {
Rep (j,1,n) vis[j] = false ;
ans -= augment(i) ;
}
if (ans < ANS) ANS = ans ;
} while (std::next_permutation(per+2,per+n+1)) ; /// Yin's permutation
printf("%d\n", ANS) ;
}
#ifdef READ
fclose(stdin) ; fclose(stdout) ;
#else
getchar() ; getchar() ;
#endif
return 0 ;
}