#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
struct node{
int x, y;
};
vector<node>buf;
int n, m, a[12], b[20], g[12][12], v[12];
int linker[12];
bool used[12];
bool dfs(int u)
{
for(int v = 0; v < n; v++)
if(g[u][v] && !used[v])
{
used[v] = true;
if(linker[v] == -1 || dfs(linker[v]))
{
linker[v] = u;
return true;
}
}
return false;
}
int hungary()
{
int res = 0;
memset(linker, -1, sizeof(linker));
for(int u = 0; u < n; u++)
{
memset(used, false, sizeof(used));
if(dfs(u)) res++;
}
return res;
}
int main()
{
int ans;
while(scanf("%d%d",&n,&m) != EOF)
{
if(n == 0){
puts("0");
continue;
}
buf.clear();
while(m--)
{
node t;
scanf("%d%d",&t.x, &t.y);
--t.x, --t.y;//编号从0到n-1
buf.push_back(t);
}
ans = 0;
for(int i = 1; i <= n; i++) a[i] = i;
do{
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
g[i][j] = 1;
for(int i = 0; i < buf.size(); i++){
g[(buf[i].x)%n][a[buf[i].y]] = 0;
g[buf[i].x%n][(a[buf[i].y]+1)%n] = 0;
}
ans = max(ans, hungary());
}while(next_permutation(a+1,a+n));//最多8!,第一个元素位置固定
printf("%d\n",n-ans);
}
return 0;
}
hdu 5727 Necklace 二分图匹配模板加上暴力枚举
最新推荐文章于 2021-01-16 21:00:13 发布