蜗牛の狂奔笔记
对于蜗牛来说,狂奔虽不代表极速,但展现的却是一种拼尽全力的姿态........
pku 1419
2009年8月9日
题目链接:
PKU 1419 Graph Coloring
分类:DFS
题目分析与算法原型
算法1:直接暴力搜索即可过,数据不强,实现默认每个点为白色,然后从第一个点开始搜索,对于当前的顶点,枚举与他相邻的点中是否有黑色,若没有则将他染黑色,然后顶点编号加一,继续搜索下一个,若与他相邻的点中有已经染黑的点,那么只能将当前的点染成白色,然后继续搜索,注意无论有没有黑色的邻点,对于当前的点都要染白一次,搜索,因为对于白色是没有限制的....
算法2:其实这是一道最大独立集问题,对于该种问题可以通过将原图求补,就可以变成求其补图的最大团问题,通过最大团来求解
(PS:算法1->47ms,算法2->0ms)
Code1:
1
#include
<
stdio.h
>
2
#include
<
string
.h
>
3
#define
max 105
4
bool
flag[max];
5
int
map[max][max],t,n,k,color[max],count,pos[max],fp,black,cnt;
//
color数组:0表示白,1表示黑
6
void
dfs(
int
num)
7
{
8
int
i;
9
if
(num
==
n)
10
{
11
int
j;
12
if
(black
>
count)
13
{
14
fp
=
0
;
15
count
=
black;
16
for
(j
=
1
;j
<=
n;j
++
)
if
(color[j]
==
1
)pos[fp
++
]
=
j;
17
}
18
return
;
19
}
20
for
(i
=
1
;i
<=
n;i
++
)
21
if
(i
!=
num
&&
map[num][i]
==
1
&&
color[i]
==
1
)
break
;
22
if
(i
>
n)
23
{
24
color[num]
=
1
;
25
black
++
;
26
dfs(num
+
1
);
27
color[num]
=
0
;
28
black
--
;
29
}
30
dfs(num
+
1
);
31
}
32
int
main()
33
{
34
int
i;
35
scanf(
"
%d
"
,
&
t);
36
while
(t
--
)
37
{
38
memset(flag,
false
,
sizeof
(flag));
39
memset(map,
0
,
sizeof
(map));
40
memset(color,
0
,
sizeof
(color));
41
scanf(
"
%d%d
"
,
&
n,
&
k);
42
for
(i
=
1
;i
<=
k;i
++
)
43
{
44
int
a,b;
45
scanf(
"
%d%d
"
,
&
a,
&
b);
46
map[a][b]
=
1
;
47
map[b][a]
=
1
;
48
}
49
count
=
0
;
50
black
=
0
;
51
dfs(
1
);
52
printf(
"
%d\n
"
,count);
53
for
(i
=
0
;i
<
fp;i
++
)
54
{
55
printf(
"
%d
"
,pos[i]);
56
if
(i
<
fp
-
1
)printf(
"
"
);
57
else
printf(
"
\n
"
);
58
}
59
}
60
return
1
;
61
}
62
63
Code2:
1
#include
<
stdio.h
>
2
#define
len 105
3
int
map[len][len],max,cnt[len],group[len],m,n,k;
4
bool
dfs(
int
num,
int
visit[len],
int
pos)
5
{
6
int
i,j;
7
for
(i
=
num
+
1
;i
<=
n;i
++
)
8
{
9
if
(cnt[i]
+
pos
<=
max)
return
false
;
//
根据cnt[]数组的非递增性可以直接返回false
10
if
(map[num][i])
11
{
12
for
(j
=
0
;j
<
pos;j
++
)
if
(map[i][visit[j]]
==
0
)
break
;
13
if
(j
==
pos)
//
与当前完全图的所有点都有边,可以加进来
14
{
15
visit[pos]
=
i;
16
if
(dfs(i,visit,pos
+
1
))
return
true
;
17
}
18
}
19
}
20
if
(pos
>
max)
21
{
22
int
kk;
23
for
(kk
=
0
;kk
<
pos;kk
++
)group[kk]
=
visit[kk];
//
更新最大完全图的顶点集合
24
max
=
pos;
25
return
true
;
//
根据cnt[]数组的非递增性可以直接返回true
26
}
27
return
false
;
28
}
29
void
init()
30
{
31
int
i,j;
32
for
(i
=
1
;i
<=
n;i
++
)
33
for
(j
=
1
;j
<=
n;j
++
)
34
{
35
if
(i
!=
j)map[i][j]
=
1
;
36
else
map[i][j]
=
0
;
37
}
38
}
39
int
main()
40
{
41
int
i,a,b,path[len];
42
scanf(
"
%d
"
,
&
m);
43
while
(m
--
)
44
{
45
scanf(
"
%d%d
"
,
&
n,
&
k);
46
init();
47
for
(i
=
1
;i
<=
k;i
++
)
48
{
49
scanf(
"
%d%d
"
,
&
a,
&
b);
50
map[a][b]
=
0
;
51
map[b][a]
=
0
;
52
}
53
54
max
=-
1
;
55
for
(i
=
n;i
>=
1
;i
--
)
56
{
57
path[
0
]
=
i;
58
dfs(i,path,
1
);
59
cnt[i]
=
max;
60
}
61
printf(
"
%d\n
"
,cnt[
1
]);
//
打印出最大完全图的顶点数
62
for
(i
=
0
;i
<
cnt[
1
];i
++
)printf(
"
%d
"
,group[i]);
//
打印出最大完全图的顶点集合
63
printf(
"
\n
"
);
64
}
65
return
1
;
66
}
posted on 2009-08-09 10:00
蜗牛也Coding
阅读(321)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 蜗牛也Coding
<
2009年8月
>
日
一
二
三
四
五
六
26
27
28
29
30
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
导航
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)
搜索
积分与排名
积分 - 92558
排名 - 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的使用(转)(17211)
2. MFC中如何将 CFormView放置到一个CDockablePane中(8220)
3. (转)关于OpenGL的安装(4830)
4. 关于 OpenGl(4424)
5. VC 界面窗口,静态分割后如何锁定分隔条或限制分隔条的移动范围(4298)
评论排行榜
1. 据说是来自chrome的代码里的一个模板(13)
2. 关于 OpenGl(10)
3. Visual Studio 历史简介(转)(6)
4. pku 1200(6)
5. VC 界面窗口,静态分割后如何锁定分隔条或限制分隔条的移动范围(5)