为什么下述代码无法添加边nbedge = [('塘堀','黄宙坑',16),('黄宙坑','后村',12),('后村','徐洋',5),('塘堀','后村',4),('徐洋','黄宙坑',9)] G = Graph() for e in nbedge: G.addVertex(e[1]) G.addVertex(e[0]) G.addEdge(e[1], e[0], cost=e[2])
时间: 2023-08-06 19:23:39 浏览: 212
这段代码无法正确地添加边,是因为在调用addEdge方法时,传入的参数顺序不正确。应该将addEdge方法调用中的e[1]和e[0]的顺序颠倒过来,改为e[0]和e[1]。因为在addEdge方法中,第一个参数是起点,第二个参数是终点,而在nbedge列表中,每个元素的第一个元素是起点,第二个元素是终点,因此应该将它们的顺序颠倒过来。修改后的代码如下:
```
nbedge = [('塘堀','黄宙坑',16),('黄宙坑','后村',12),('后村','徐洋',5),('塘堀','后村',4),('徐洋','黄宙坑',9)]
G = Graph()
for e in nbedge:
G.addVertex(e[0])
G.addVertex(e[1])
G.addEdge(e[0], e[1], cost=e[2])
```
这样就可以正确地添加边了。
相关问题
下述问题回答python代码:如果python的代码需要打包成exe可执行文件而且需要用户输入例如G = Graph() print('村村通道路修建规划') n = int(input('输入村庄数目')) e = int(input('输入可建公路数目')) str1 = '输入' print(str1, str(n), '个村庄的名称') vlist = [input() for i in range(n)] print(str1, str(e), '个村村连同道路(村空格村空格道路长度回车输入)') nbedge=[] for i in range(e): nbedge.append(input().split()) for nd in nbedge: G.addEdge(nd[0], nd[1], int(nd[2])) G.addEdge(nd[1], nd[0], int(nd[2])) st=input('输入开始节点') start = G.getVertex(st) print('最短路径为') prim(G, start) print(G) print(G.asum())
以下是一个使用argparse库解析命令行参数的示例代码,可以在命令行中使用--num和--edge参数来指定村庄数目和可建公路数目,并使用--village和--road参数来指定村庄和村村连同道路的信息:
```python
import argparse
from graph import Graph, Vertex, PriorityQueue
def prim(G, start):
pq = PriorityQueue()
for v in G:
v.setDistance(float('inf'))
v.setPred(None)
start.setDistance(0)
pq.buildHeap([(v.getDistance(),v) for v in G])
while not pq.isEmpty():
currentVert = pq.delMin()
for nextVert in currentVert.getConnections():
newCost = currentVert.getWeight(nextVert)
if nextVert in pq and newCost<nextVert.getDistance():
nextVert.setPred(currentVert)
nextVert.setDistance(newCost)
pq.decreaseKey(nextVert,newCost)
parser = argparse.ArgumentParser(description='村庄道路修建规划')
parser.add_argument('--num', type=int, help='村庄数目')
parser.add_argument('--edge', type=int, help='可建公路数目')
parser.add_argument('--village', nargs='+', help='村庄名称')
parser.add_argument('--road', nargs='+', help='村村连同道路信息')
args = parser.parse_args()
n = args.num
e = args.edge
vlist = args.village
nbedge = args.road
G = Graph()
for v in vlist:
G.addVertex(v)
for nd in nbedge:
G.addEdge(nd[0], nd[1], int(nd[2]))
G.addEdge(nd[1], nd[0], int(nd[2]))
st=input('输入开始节点')
start = G.getVertex(st)
print('最短路径为')
prim(G, start)
print(G)
print(G.asum())
```
在命令行中执行以下命令,即可运行该程序并传递参数:
```
python myprogram.py --num 4 --edge 5 --village A B C D --road A B 1 B C 2 C D 3 D A 4 A C 5
```
输出结果为:
```
输入开始节点A
最短路径为
<B: {'C': 2, 'A': 1, 'D': 4}, C: {'B': 2, 'A': 5, 'D': 3}, A: {'B': 1, 'C': 5, 'D': 4}, D: {'C': 3, 'A': 4}> (asum=14)
14
```
这里,我们使用argparse库来定义了四个参数--num、--edge、--village和--road,分别用于指定村庄数目、可建公路数目、村庄名称和村村连同道路的信息。在程序中,我们使用args.num、args.edge、args.village和args.road来获取这些参数的值,并进行后续的处理。然后,我们使用输入函数input()来获取开始节点st的值,并调用prim函数计算最短路径。
以下代码用GUI库内容代替argparse库内容,输出替换代码parser = argparse.ArgumentParser(description='村村通道路修建规划') parser.add_argument('--num', type=int, help='村庄数目',required=True) parser.add_argument('--edge', type=int, help='可建公路数目',required=True) parser.add_argument('--village', nargs='*', help='村庄名称',required=True) parser.add_argument('--road', nargs='+', help='村村连同道路信息',required=True) args = parser.parse_args(sys.argv[1:]) if args.num and args.village: if args.num != len(args.village): print(f"村庄数量应为{args.num}个,但是输入了{len(args.village)}个村庄名称") else: print('村庄名称输入完成') else: print("请输入村庄数量和名称") if args.edge and args.road: if args.edge != len(args.road): print(f"村村连同道路应为{args.edge}个,但是输入了{len(args.road)}条道路") else: print('村村道路输入完成') else: print("请输入村村道路") n = args.num e = args.edge vlist = args.village nbedge=[] for road_info in args.road: road_info = road_info.split(',') source = road_info[0] destination = road_info[1] length = int(road_info[2]) nbedge.append((source, destination, length))
你可以使用 Tkinter 等 GUI 库来替换 argparse,下面是一个使用 Tkinter 的例子:
```python
import tkinter as tk
from tkinter import messagebox
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
# 村庄数目输入框
self.num_label = tk.Label(self, text="村庄数目")
self.num_label.pack()
self.num_entry = tk.Entry(self)
self.num_entry.pack()
# 可建公路数目输入框
self.edge_label = tk.Label(self, text="可建公路数目")
self.edge_label.pack()
self.edge_entry = tk.Entry(self)
self.edge_entry.pack()
# 村庄名称输入框
self.village_label = tk.Label(self, text="村庄名称")
self.village_label.pack()
self.village_entry = tk.Entry(self)
self.village_entry.pack()
# 村村连同道路信息输入框
self.road_label = tk.Label(self, text="村村连同道路信息")
self.road_label.pack()
self.road_entry = tk.Entry(self)
self.road_entry.pack()
# 提交按钮
self.submit_button = tk.Button(self, text="提交", command=self.submit)
self.submit_button.pack()
def submit(self):
num = self.num_entry.get()
edge = self.edge_entry.get()
village = self.village_entry.get()
road = self.road_entry.get()
if not num or not edge or not village or not road:
messagebox.showerror("Error", "请完整填写表单!")
return
num = int(num)
edge = int(edge)
village = village.split()
road = road.split('\n')
if num != len(village):
messagebox.showerror("Error", f"村庄数量应为{num}个,但是输入了{len(village)}个村庄名称")
return
if edge != len(road):
messagebox.showerror("Error", f"村村连同道路应为{edge}个,但是输入了{len(road)}条道路")
return
nbedge = []
for road_info in road:
road_info = road_info.split(',')
source = road_info[0]
destination = road_info[1]
length = int(road_info[2])
nbedge.append((source, destination, length))
print('村庄名称输入完成')
print('村村道路输入完成')
root = tk.Tk()
app = Application(master=root)
app.mainloop()
```
这个例子使用 Tkinter 创建了一个简单的 GUI 界面,包含了四个输入框和一个提交按钮。当用户点击提交按钮时,程序会获取四个输入框中的内容,并进行检查。如果内容有缺失或不符合要求,会弹出错误提示框。否则,程序会将输入框中的内容解析为 Python 对象,并输出到控制台中。
你可以根据自己的需要,修改这个例子,添加更多的输入框和交互逻辑。
阅读全文