#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> using namespace std; const int maxn=9+5; int n, m, a[maxn], dis, from[maxn]; bool br[maxn][maxn], st[maxn][maxn], vis[maxn]; void Init() { memset(br, false, sizeof br); return ; } bool Dfs(int u) { for(int i=1; i<=n; i++) { if(vis[i] || !st[u][i]) continue; vis[i]=true; if(!from[i] || Dfs(from[i])) { from[i]=u; return true; } } return false; } int main() { while(scanf("%d%d", &n, &m)!=EOF) { if(!n) { printf("0\n"); continue; } Init(); for(int i=1, u, v; i<=m; i++) { scanf("%d%d", &u, &v); br[u][v]=true; } for(int i=1; i<=n; i++) a[i]=i; int ans=n; do { memset(st, false, sizeof st); for(int i=1; i<=n; i++) { if(!br[i][a[1]] && !br[i][a[n]]) st[n][i]=true; for(int j=1; j<n; j++) if(!br[i][a[j]]&& !br[i][a[j+1]]) st[j][i]=true; } int tmp=0; memset(from, 0, sizeof from); for(int i=1; i<=n; i++) { memset(vis, false, sizeof vis); tmp+=Dfs(i); } ans=min(ans, n-tmp); }while(ans && next_permutation(a+1, a+1+n-1)); printf("%d\n", ans); } return 0; }
|