蜗牛の狂奔笔记
对于蜗牛来说,狂奔虽不代表极速,但展现的却是一种拼尽全力的姿态........
zju 1492
2009年8月11日
题目链接:
ZJU 1492 Maximum Clique
分类:典型的NP问题之最大团
题目分析与算法原型
这是一个最大团问题,老实说,这道题已经TLE了好多次,之后由于细节上的一个错误又WA了几次(TLE就算了,还WA了,真有必要BS下自己),先前简直就是直接暴力DFS,然后才发现这题不愧是NP问题,10秒的限时都被我超了(看来这种问题还是不能有侥幸心理,orz......)
当然这题也是可以在我原先的想法上减枝的,我原先的想法是从0开始一直到n-1枚举每个点进行一次dfs,因为问题求的是最大的完全子图的顶点数,所以,我每加进来一个点,枚举和其相邻的点x,判断下x是否和已经加近来的点(用一个数组记录当前已经找到的最大的完全图的各个顶点编号)都有边,当且仅当和里面所有的点都有边时候才把x加入.........思路是比较清晰,但是这复杂度简直不可想象,其实有个比较好的方法(小Q同学的提醒),从n-1到0枚举每个点,保存一个数组cnt[],其中cnt[i]记录的是从顶点i一直到n-1这些点中找到的完全图的最大顶点数(那么原问题就是求cnt[0]),到这里那么我们可以发现cnt[i-1]=cnt[i]或者cnt[i]+1,这一步的发现很重要,因为是一个很有力的减枝,每次从传入的顶点编号num的下个num+1到n-1找与num相邻的点,设当前枚举的是i,若当前找到的完全图的顶点数+cnt[i]<=max(max为现在找到的所有完全图的最大顶点数)那么直接返回false,因为cnt[]数组是非递增的,所有以后的都可以不用考虑了,还有根据cnt数组的这一个非递增的特性,一旦某次更新了max,也就可以直接返回true了..........
Code:
1
#include
<
stdio.h
>
2
#include
<
string
.h
>
3
#define
len 55
4
int
map[len][len],n,max,cnt[len];
5
bool
dfs(
int
num,
int
visit[len],
int
pos)
6
{
7
int
i,j;
8
for
(i
=
num
+
1
;i
<
n;i
++
)
9
{
10
if
(cnt[i]
+
pos
<=
max)
return
false
;
11
if
(map[num][i])
12
{
13
for
(j
=
0
;j
<
pos;j
++
)
if
(map[i][visit[j]]
==
0
)
break
;
14
if
(j
==
pos)
15
{
16
visit[pos]
=
i;
17
if
(dfs(i,visit,pos
+
1
))
return
true
;
18
}
19
}
20
}
21
if
(pos
>
max)
22
{
23
max
=
pos;
24
return
true
;
25
}
26
return
false
;
27
}
28
int
main()
29
{
30
while
(scanf(
"
%d
"
,
&
n)
!=
EOF
&&
n)
31
{
32
int
i,j,path[len];
33
for
(i
=
0
;i
<
n;i
++
)
34
for
(j
=
0
;j
<
n;j
++
)scanf(
"
%d
"
,
&
map[i][j]);
35
max
=-
1
;
36
for
(i
=
n
-
1
;i
>=
0
;i
--
)
37
{
38
path[
0
]
=
i;
39
dfs(i,path,
1
);
40
cnt[i]
=
max;
41
}
42
printf(
"
%d\n
"
,cnt[
0
]);
43
}
44
return
1
;
45
}
posted on 2009-08-11 18:01
蜗牛也Coding
阅读(530)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 蜗牛也Coding
<
2011年8月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
导航
C++博客
首页
新随笔
联系
聚合
管理
统计
随笔 - 78
文章 - 0
评论 - 96
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(8)
给我留言
查看公开留言
查看私人留言
随笔档案
(78)
2011年7月 (1)
2011年4月 (1)
2010年11月 (4)
2010年10月 (4)
2010年9月 (2)
2010年8月 (7)
2010年3月 (1)
2010年2月 (5)
2009年12月 (2)
2009年10月 (1)
2009年9月 (1)
2009年8月 (16)
2009年7月 (31)
2009年6月 (2)
搜索
积分与排名
积分 - 92679
排名 - 258
最新评论
1. re: 关于 OpenGl
太谢谢了。
--袁锋
2. re: 关于 OpenGl
太感谢!
--芙
3. re: 关于MAC系统win 7虚拟机不能上网的问题[未登录]
.vmx文件在哪里?
--a
4. re: MFC中如何将 CFormView放置到一个CDockablePane中
注释掉的创建部分,指针调用
为何不用友元类声明下,就可以用了的。CreateOne,有点绕。
感谢博主分享。
--ren
5. re: 关于 OpenGl
非常感谢~~
--无叶莲
阅读排行榜
1. pragma comment的使用(转)(17212)
2. MFC中如何将 CFormView放置到一个CDockablePane中(8223)
3. (转)关于OpenGL的安装(4831)
4. 关于 OpenGl(4426)
5. VC 界面窗口,静态分割后如何锁定分隔条或限制分隔条的移动范围(4299)
评论排行榜
1. 据说是来自chrome的代码里的一个模板(13)
2. 关于 OpenGl(10)
3. Visual Studio 历史简介(转)(6)
4. pku 1200(6)
5. VC 界面窗口,静态分割后如何锁定分隔条或限制分隔条的移动范围(5)