回溯算法——图着色

"""
# @Time    :  2020/11/26
# @Author  :  Jimou Chen
"""
'''
输入n个顶点,m种颜色,还有该图的邻接矩阵
假设第一个顶点是1,第一种颜色是1
'''
n, m = map(int, input().split())
graph = [[0 for _ in range(100)] for _ in range(100)]  # 存放邻接矩阵
color = [0 for _ in range(100)]  # 存放最后符合着色情况
cnt = 0  # 记录有多少种着色方案


# 检查第i个顶点的颜色是否满足条件
def check(k):
    for i in range(1, k + 1):
        # k与i之间相连并且i顶点的颜色与k顶点的颜色相同
        if graph[k][i] == 1 and color[i] == color[k]:
            return 0
    return 1


def dfs(step):
    global cnt
    # 所有的顶点已经涂完颜色
    if step == n + 1:
        for i in range(1, n + 1):
            print(color[i], end=' ')
        print()
        cnt += 1
        return

    # 遍历填m种颜色
    for i in range(1, m + 1):
        color[step] = i
        if check(step):
            dfs(step + 1)
        color[step] = 0  # 回溯,0表示没有着色


if __name__ == '__main__':
    for i in range(1, n + 1):
        temp = list(map(int, input().split()))
        for j in range(1, n + 1):
            graph[i][j] = temp[j - 1]

    dfs(1)
    print('总方案数: ', cnt)

'''

5 4 
0 1 1 1 0 
1 0 1 1 1 
1 1 0 1 0 
1 1 1 0 1 
0 1 0 1 0

48
'''
posted @ 2020-11-26 15:51  JackpotNeaya  阅读(207)  评论(0)    收藏  举报