1. 程式人生 > 實用技巧 >回溯演算法——圖著色

回溯演算法——圖著色

"""
# @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
'''