题目描述:
编写程序,实现输入图G,基于韦尔奇·鲍威尔法对图G的结点进行着色,输出对应的一个正常着色。
编程语言可选择C、C++、Java或Python。
正常着色输出格式示例(设图G的结点为v1,v2,v3,颜色用1,2,3等数字代表):
------------------
v1:1,v2:2,v3:3
------------------
Python代码实现如下:
def welsh_powell(graph):
# 对结点按照度数从大到小排序
sorted_nodes = sorted(graph, key=lambda x: len(graph[x]), reverse=True)
# 初始化结点的颜色字典
colors = {}
# 初始化当前结点可用的颜色列表
available_colors = [i for i in range(len(graph), 0, -1)]
# 遍历每个结点
for center_node in sorted_nodes:
# 如果此节点已经存在于colors中,跳过
if center_node in colors:
continue
# 对节点着新颜色
colors[center_node] = available_colors.pop()
# 非邻接节点的前面所有着色点
pre_nodes = [center_node]
# 对符合要求的非邻接节点着同种颜色
other_node_get_color(sorted_nodes, colors, pre_nodes, graph)
return colors
def other_node_get_color(m_sorted_nodes, m_colors, m_pre_nodes, my_graph):
# 前面所有着色点列表的最后一个节点下标
index = m_sorted_nodes.index(m_pre_nodes[-1])
# 遍历剩余节点,若不符合要求则flag=0
for i in range(index+1, len(m_sorted_nodes)):
flag = 1
for each in m_pre_nodes:
if m_sorted_nodes[i] in my_graph[each]:
flag = 0
break
if m_sorted_nodes[i] in m_colors:
flag = 0
# 若符合要求,着相同颜色,并再次递归向后寻找
if flag:
m_colors[m_sorted_nodes[i]] = m_colors[m_pre_nodes[-1]]
m_pre_nodes.append(m_sorted_nodes[i])
other_node_get_color(m_sorted_nodes, m_colors, m_pre_nodes, my_graph)
break
if __name__ == "__main__":
# graph表示输入的图,用字典表示,键是节点,值是一个包含与此节点所有的邻接节点的集合
m_graph = {}
# 为了输出时是有序的,存储输入时的顺序,在输出时按此顺序输出
m_promise = []
while True:
key = input("请输入节点(以-1结尾):\n")
if key == "-1":
break
m_promise.append(key)
nodes = input("请输入与此节点邻接的节点,以空格为分界符:\n")
value = nodes.split(sep=" ")
m_graph.setdefault(key, set(value))
m_color = welsh_powell(m_graph)
# 将着色结果输出到文件
with open("graph.txt", "w") as f:
f.write("------------------\n")
length = len(m_color)
for order in m_promise:
for m_node in m_color:
if m_node == order:
f.writelines([m_node, ":", str(m_color[m_node])])
if length > 1:
f.write(",")
length -= 1
break
f.write("\n------------------\n")
由于此代码的运行的特殊性,笔者只选取一道题作为例子:
将每个节点及每个节点的邻接节点输入后,graph.txt内容:
------------------
v1:1,v2:3,v3:2,v4:2,v5:1,v6:3,v7:3,v8:2
------------------