西南交通大学【离散数学编程作业4】

题目描述:

编写程序,实现输入图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")

由于此代码的运行的特殊性,笔者只选取一道题作为例子:

54f0dd986a8e4893860bdfb0e7b9f938.jpeg

将每个节点及每个节点的邻接节点输入后,graph.txt内容:

------------------

v1:1,v2:3,v3:2,v4:2,v5:1,v6:3,v7:3,v8:2

------------------

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还有糕手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值