求助 Python 最小生成树
7-1 村村相连漳州市政府调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。市政府的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
输入格式:
有多组测试数据,每组数据请依次输入图中各顶点的值,每个顶点值以回车间隔,并以#作为输入结束符;再请依次输入图中每条边的两个顶点值,两个顶点值以空格作为间隔,每输入一组后进行换行,仍以#结束输入;最后一行为某顶点v。
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N(N<100)和两村庄间的公路数M;随后的M行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N、M为0时,输入结束,该用例不被处理。
输出格式:
对每个测试用例,在1行里输出最小的公路总长度,如果未能找到请输出"no found!"。
输入样例:
在这里给出两组输入。例如:
3 3
1 2 10
1 3 20
2 3 40
4 6
1 2 10
1 3 40
1 4 10
2 3 30
2 4 20
3 4 50
0 0
#
输出样例:
在这里给出相应的输出。例如:
30
50 def tempfun(x,y):
if x > y:
return (y,x)
else:
return (x,y)
temp = 0
lst=[]
lst2=[]
while temp != '#':
temp=input()
lst +=
for i in range(len(lst)):
if lst.count(' ') == 1:
lst2.append(lst[-1])+1])
lst2=lst2[:-1]
for i in lst2:
try:
dic={}
for j in i:
lstj=j.split()
x = int(lstj)
y = int(lstj)
z = int(lstj)
dic[(x,y)]=z
long=[]
for cell in dic:
temp=[]
for num in range(1,max(dic.keys())+1):
if num != cell and num != cell:
temp.append(dic,num)]+dic,num)])
temp.append(dic)
m = min(temp)
long.append(m)
print(max(long))
except:
print('no found!')
逃兵 发表于 2020-12-12 15:19
3 2
1 2 10
2 3 40
4 6
1 2 10
1 3 40
1 4 10
2 3 30
2 4 20
3 4 50
0 0
#
大佬 您的思路在这种样例上有点过不了 (但不一定有直接的公路相连,只要能间接通过公路可达即可)因为可以间接相通 所以本来输出应该是
50
50
但是我们现在只能输出
no found!
50
这要怎么办呀{:10_266:} 欧德奈瑞 发表于 2020-12-13 11:42
大佬 您的思路在这种样例上有点过不了 (但不一定有直接的公路相连,只要能间接通过公路可达即可)因为 ...
是我不严谨了,我再想想{:10_266:} 逃兵 发表于 2020-12-14 08:15
是我不严谨了,我再想想
感谢大佬 麻烦您了 欧德奈瑞 发表于 2020-12-14 10:00
感谢大佬 麻烦您了
def test(values,village_num):
templst=[]
try:
templst.append(village_dic)
except:
pass
for i in range(1,village_num+1):
if i not in values:
try:
roads = village_dic,i)]+village_dic)]
templst.append(roads)
except:
pass
return templst
def tempfun(x,y):
if x > y:
return (y,x)
else:
return (x,y)
temp = 0
lst=[]
lst2=[]
while temp != '#':
temp=input()
lst +=
for i in range(len(lst)):
if lst.count(' ') == 1:
lst2.append(lst[-1])+1])
lst2=lst2[:-1]
for i in lst2:
village_num = int(i)
village_dic={}
newdic={}
dickeys = [(j,i) for i in range(1,village_num+1) for j in range(1,i)]
try:
for j in i:
lstj=j.split()
x = int(lstj)
y = int(lstj)
z = int(lstj)
village_dic[(x,y)]=z
for values in dickeys:
templst = test(values,village_num)
newdic = templst
minlst=[]
for i in newdic:
minlst.append(min(newdic))
print(max(minlst))
except:
print('no found!')
多给点例子我测测 逃兵 发表于 2020-12-14 11:29
多给点例子我测测
大佬您看看 非常感谢
输入样例2:
4 5
1 2 10
1 3 40
1 4 10
2 4 20
3 4 50
5 6
1 2 20
1 3 10
1 4 20
1 5 10
2 5 30
4 5 30
6 6
1 2 20
1 4 30
1 6 50
2 3 10
4 5 20
5 6 10
0 0
#
输出样例2:
60
60
90 欧德奈瑞 发表于 2020-12-14 19:05
大佬您看看 非常感谢
输入样例2:
例2
01
我计算出来的每一种公路长度
{(1, 2): , (1, 3): , (2, 3): , (1, 4): , (2, 4): , (3, 4): }
最短不应该是50吗{:10_250:}
02
我计算出来的每一种公路长度
{(1, 2): , (1, 3): , (2, 3): , (1, 4): , (2, 4): , (3, 4): , (1, 5): , (2, 5): , (3, 5): , (4, 5): }
最短不应该是40吗{:10_250:}
03
需要两次周转才能计算,这里没有计算
是不是我没有理解题目的意思{:10_266:} 逃兵 发表于 2020-12-14 21:26
例2
01
我计算出来的每一种公路长度
大佬 以下是唯一样例 您看看
输入样例
3 3
1 2 1
1 3 2
2 3 4
4 6
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
3 1
1 2 1
4 3
1 2 4
1 4 2
2 4 1
4 0
6 9
1 2 34
1 3 46
1 6 19
2 5 12
3 4 17
3 6 25
4 5 38
4 6 25
5 6 26
0 0
#
输出样例
3
5
no found!
no found!
no found!
99
大佬 应该是您的理解有一点偏差 “要求铺设的公路总长度为最小。请计算最小的公路总长度”是说求能保证村村相通的各条公路的总长度之和最小的这个数值 比如上面最后一组样例输出99=19+25+17+26+12画个图大佬应该就可以看得出来啦{:10_254:} class Graph(object):
def __init__(self, maps):
self.maps = maps
self.nodenum = self.get_nodenum()
self.edgenum = self.get_edgenum()
def get_nodenum(self):
return len(self.maps)
def get_edgenum(self):
count = 0
for i in range(self.nodenum):
for j in range(i):
if self.maps > 0 and self.maps < 9999:
count += 1
return count
def kruskal(self):
res = []
if self.nodenum <= 0 or self.edgenum < self.nodenum-1:
return res
edge_list = []
for i in range(self.nodenum):
for j in range(i,self.nodenum):
if self.maps < 9999:
edge_list.append(])#按形式加入
edge_list.sort(key=lambda a:a)#已经排好序的边集合
group = [ for i in range(self.nodenum)]
for edge in edge_list:
for i in range(len(group)):
if edge in group:
m = i
if edge in group:
n = i
if m != n:
res.append(edge)
group = group + group
group = []
return res
def tempfun(x,y):
if x > y:
return (y,x)
else:
return (x,y)
lst=[]
lst2=[]
temp=0
while temp != '#':
temp=input()
lst +=
for i in range(len(lst)):
if lst.count(' ') == 1:
lst2.append(lst[-1])+1])
lst2=lst2[:-1]
for i in lst2:
village_num = int(i)
village_dic={}
newdic={}
dickeys = [(j,i) for i in range(1,village_num+1) for j in range(1,i)]
for j in i:
lstj=j.split()
x = int(lstj)
y = int(lstj)
z = int(lstj)
village_dic[(x,y)]=z
for keys in dickeys:
if keys not in village_dic:
village_dic=9999
for num in range(1,village_num+1):
village_dic[(num,num)] = 0
maps = []
templst = []
for x in range(1,village_num+1):
for y in range(1,village_num+1):
templst.append(village_dic)
maps.append(templst)
templst=[]
graph = Graph(maps)
if len(graph.kruskal()) < village_num-1:
print('no found!')
else:
roadsum = 0
for i in graph.kruskal():
roadsum+=i[-1]
print(roadsum)
查了很多很多资料,学了很多东西,受教了 逃兵 发表于 2020-12-15 11:21
查了很多很多资料,学了很多东西,受教了
参考链接
页:
[1]