python - 图上实现算法的输出
问题描述
这段代码是对图的一些操作,基本上输入指令如下:
class NodoArvore:
def __init__(self, chave=None, esquerda=None, direita=None):
self.chave = chave
self.esquerda = esquerda
self.direita = direita
def __repr__(self):
return '%s <- %s -> %s' % (self.esquerda and self.esquerda.chave,
self.chave,
self.direita and self.direita.chave)
raiz = NodoArvore(40)
raiz.esquerda = NodoArvore(20)
raiz.direita = NodoArvore(60)
raiz.direita.esquerda = NodoArvore(50)
raiz.direita.direita = NodoArvore(70)
raiz.esquerda.esquerda = NodoArvore(10)
raiz.esquerda.direita = NodoArvore(30)
解决方案
我稍微清理了你的函数并添加了最终计算。我还使用字典而不是边/权重列表来使图形更改更容易实现(并且更有效):
graph = dict()
directed = True
def add_node(v):
if v in graph: return print(v, "is already part of the graph")
graph[v] = dict()
def add_edge(v1,v2,weight):
if v1 not in graph or v2 not in graph:
return print(v1,"or",v2,"not part of the graph")
if v2 in graph[v1]:
return print((v1,v2),"already part of the graph")
graph[v1][v2] = weight
if not directed: graph[v2][v1] = weight
def delete_edge(v1,v2):
if v1 not in graph or v2 not in graph[v1]:
return print((v1,v2),"not part of the graph")
graph[v1].pop(V2)
if not directed: graph[v2].pop(V1)
def delete_node(v):
if v not in graph: return print(v,"not part of the graph")
for e in graph.values():
if v in e: e.pop(v)
graph.pop(v)
def count_edges():
return sum(map(len,graph.values()))//[2,1][directed]
def count_weights():
return sum(w for e in graph.values() for w in e.values())/[2,1][directed]
用法:
no_operations = int(input("Enter number of operations: "))
for _ in range(no_operations):
command = input("Enter command: ")
oper,v1,v2, weight,*_ = command.split(" ") + ["",""]
if oper == 'IV': add_node(v1)
elif oper == 'IA': add_edge(v1,v2,float(weight))
elif oper == 'RV': delete_node(v1)
elif oper == 'RA': delete_edge(v1,v2)
else:print("Invalid command")
nodeCount = len(graph)
edgeCount = count_edges()
weights = count_weights()
print(nodeCount,"vertex(s),",edgeCount,"edge(s) and total weight",weights)
print(graph)
样品运行:
Enter number of operations: 4
Enter command: IV A
Enter command: IA B A 1
not part of the graph
Enter command: IV B
Enter command: IA A B 2
2 vertex(s), 1 edge(s) and total weight 2.0
{'A': {'B': 2.0}, 'B': {'A': 2.0}}
...
# directed graph:
Enter number of operations: 14
Enter command: IV A
Enter command: IV B
Enter command: IV C
Enter command: IV D
Enter command: IA A B 0.1
Enter command: IA A C 0.2
Enter command: IA B A 0.3
Enter command: IA B C 0.4
Enter command: IA C A 0.5
Enter command: IA C B 0.6
Enter command: IV D
D is already part of the graph
Enter command: IV E
Enter command: IA D E -10
Enter command: RV A
4 vertex(s), 3 edge(s) and total weight -9.0
{'B': {'C': 0.4}, 'C': {'B': 0.6}, 'D': {'E': -10.0}, 'E': {}}
推荐阅读
- crash - iOS 13 TTS 崩溃 - 无法找到资源 `lang'[kLanguage] - (AVSpeechSynthesisVoice, AVSpeechUtterance)
- c - 将用户输入作为历史记录返回列表
- javascript - Mongodb $and 运算符无法按预期工作
- php - 类 Illuminate\Routing\Redirector 的对象无法转换为 int laravel
- python - 如何在unittest中自动生成测试用例编号?
- python - 使用 Python 转换复杂的平面文件
- javascript - 在java脚本中硬编码,一些减少此代码的建议表示赞赏
- php - 如何将具有相同结束时间的数组与下一个数组开始时间合并
- visual-studio-code - 编辑看起来不一样的多行
- ms-word - 如何检索在 webaddin 的内容控件中输入的数据