#include<stdio.h>
long long st[36];
long long latter[36];
const long long ONE = 1;
int n;
bool dfs(long long state, int step, int begin, int MAXSTEP)
{
if (state == (ONE << n) - 1)return true;
if (step == MAXSTEP )return false;
if (begin > n)return false;
for (int i = begin; i <= n; i++)
{
if ((state | latter[i]) != (ONE<<n)-1)//剪枝
break;
if ((state | st[i]) == state)
continue;
if (dfs(state | st[i], step + 1, begin + 1, MAXSTEP))
return true;
}
return false;
}
int main()
{
int m;
while (scanf("%d %d", &n, &m) != EOF && (n ||m ))
{
int i;
long long state = 0;
int a, b;
FILE *fp = fopen ("in.txt", "r");
for (i = 1; i <= n; i++)
{
st[i] = (ONE << (i - 1));
latter[i] = 0;
}
for (i = 0; i < m; i++)
{
fscanf (fp, "%d %d", &a, &b);
st[a] |= (ONE << (b-1));
st[b] |= (ONE << (a-1));
}
latter[n] = st[n];
for (i = n-1; i >0; i--)
{
latter[i] = st[i] | latter[i + 1];
}
for (i = 1; i <= n; i++)
{
if (dfs(state, 0, 1, i))//枚举n个服务站中的i个
{
printf ("%d\n", i);
break;
}
}
}
getchar();
return 0;
}
HUST 挂的第一场比赛终于完成了,虽然磕磕绊绊还带搜结题报告, 刘汝佳推荐的题果然都很棒。先把算法竞赛所涉及的题型过一遍。
搜索1:
这个题实际上是顶点覆盖问题,算法导论622页有介绍,是NP完全问题,就是说,没有多项式时间的解法,只能搜索。。。