Node 들이 있고, 각 Node는 Edge에 의해 다른 Node와 연결되어 있습니다.
Node에 색을 칠하는 데, 제한조건은 Edge로 연결되어 있는 바로 옆 Node와 색이 같아서는 안 됩니다.
목표는 최소한의 색으로 Node들을 칠하는 것입니다.
제 알고리즘은
- Node 중 Edge의 수가 가장 작은 Node부터 색을 칠합니다.
- 색을 칠할 때에는 연결되어 있는 Node에 칠해져있는 색을 알아봅니다.
- 색의 가지수는 많아봐야 Node 숫자보다는 작으므로, 0부터 최대치(Node의 갯수)까지 넣어보는 데, 연결되어 있는 Node에 그 숫자가 없으면 일단 그 Node에 가장 낮은 수를 넣습니다.
결과는 썩 좋은 편은 아닙니다. ㅋㅋㅋ 계속 개선해나가야죠.
def ConnectedNodes( SelectedNode, edges ):
# 연결되어 있는 노드를 담을 리스트
ConnectedNodes = []
# edge를 죽 훑어본다.
for edge in edges:
if SelectedNode in edge:
temp = list(edge)
temp.remove(SelectedNode)
tempint = int(temp[0])
ConnectedNodes.append(tempint)
return ConnectedNodes
def ColoringNode( index, edges, solution, node_count, Color ):
#연결되어있는 node의 리스트 생성
CNodes = ConnectedNodes( index, edges )
#연결되어 있는 node의 색깔을 받는다.
CNColors = []
for cn in CNodes:
CNColors.append(solution[cn])
#0부터 node의 숫자만큼의 색깔 중에서 가장 낮은 숫자를 칠한다.
for i in range(0, node_count):
if not i in CNColors:
solution[index] = i
return
solution[index] = Color
return
def solve_it(input_data):
# Modify this code to run your optimization algorithm
# parse the input
lines = input_data.split('\n')
first_line = lines[0].split()
node_count = int(first_line[0])
edge_count = int(first_line[1])
edges = []
for i in range(1, edge_count + 1):
line = lines[i]
parts = line.split()
edges.append((int(parts[0]), int(parts[1])))
solution = [-1]*node_count
# 각 node별로 edge들의 갯수를 구한다.
NodesHaveEdgenum = [0]*node_count
for edge in edges:
NodesHaveEdgenum[edge[0]] += 1
NodesHaveEdgenum[edge[1]] += 1
# 각 node별로 edge의 수가 적은 순으로 사전 정렬
WeightedIndex = []
for i in range(0, node_count):
WeightedIndex.append( [i,NodesHaveEdgenum[i]] )
WeightedIndex = sorted( WeightedIndex, key=lambda WeightedIndex:WeightedIndex[1], reverse=False )
#사전 정렬 끝.
#계산이 끝난 후 solution에서 각각 1을 빼야됨
#많아봐야 노드 갯수 이상의 색을 칠할 필요는 없으므로 loop의 한계는 node수로 한계지어놓는다.
for i, index in enumerate(WeightedIndex):
#node의 index를 주면 해당 node에 가장 작은 색을 칠한다.
#print "index[0]: ", index[0], " ,edges: ", edges, " ,solution: ", solution, " ,i: ", i
ColoringNode( index[0], edges, solution, node_count, i )
# prepare the solution in the specified output format
output_data = str(node_count) + ' ' + str(0) + '\n'
output_data += ' '.join(map(str, solution))
return output_data
import sys
if __name__ == '__main__':
if len(sys.argv) > 1:
file_location = sys.argv[1].strip()
input_data_file = open(file_location, 'r')
input_data = ''.join(input_data_file.readlines())
input_data_file.close()
print solve_it(input_data)
else:
print 'This test requires an input file. Please select one from the data directory. (i.e. python solver.py ./data/gc_4_1)'
댓글 없음:
댓글 쓰기