目录
前言
在用python练习最小生成树的时候遇到了困难(ノへ ̄、)
题目如下:
输入:第1行为2个整数,分别是顶点数n和边数m;第2行开始,是m个形如(i, j, wij)的权边序列(边集)。
输出:第1行为1个整数,为最小生成树的权值;第2行开始,是n-1个形如(i, j, wij)的表示最小生成树的权边序列(边集)。
其中,n取值20-50,m取值1-n(n-1)/2,顶点编序1-n,权取值1-50;输入输出均为数据文件(文本形式)。
一、最小生成树
最小生成树用的是Kruskal算法,二维列表存放数据,先读入顶点数m,边数n;再读入边集。
例如:
9 14
0 1 4
0 7 8
1 2 8
7 8 7
7 6 1
2 3 7
2 5 4
6 5 2
3 4 9
5 4 10
3 5 14
2 8 2
8 6 6
1 7 11
二、python对文件进行读写操作
1.将从文件读取数据并存入二维列表
with open("read.txt",mode = 'r')as f:
row = f.readlines() #读取所有行
a = []
for i in range(len(row)):
#strip():移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
#split():指定分隔符对字符串进行切片
num_row = row[i].strip().split("")
a.append(num_row) #在列表末尾添加新的对象
print(a)
2.将字符型列表转换成int型
代码如下:
a = [list(map(int,item)) for item in a]
3.单独读入第一行内容
由于第一行是顶点数和边数,应该单独读入。
f=open("data.txt",mode="r")
first=f.readlines()
m,n=map(int, first[0].split()) #单行读入用空格隔开的两个整数a,b;注意input()的返回类型是str
4.跳过第一行内容读入
with open("data.txt","r") as f:
next(f)
row = f.readlines()
5.将二维列表写入文件
#res 权值总和;path 最小生成树路径
output = open('output.txt','w+')
output.write(str(res))
output.write('\n')
for i in range(len(path)):
for j in range(len(path[i])):
output.write(str(path[i][j]))
output.write(' ')
output.write('\n')
output.close()
总结
完整代码:
# m 节点数,n边数
f=open("kruskal.txt",mode="r")
first=f.readlines()
m,n=map(int, first[0].split()) #单行读入用空格隔开的两个整数a,b;注意input()的返回类型是str
#跳过第一行开始读入
with open("kruskal.txt","r") as f:
next(f)
row = f.readlines()
#readlines 会读入 \n 所以循环rstrip把每一行的换行符去除
for i in range(0, len(row)):
row[i] = row[i].rstrip('\n')
a=[]
for i in range(len(row)):
num_row=row[i].strip().split(" ")
a.append(num_row)
a=[list(map(int,item)) for item in a] #将字符型列表转换成int型
a.sort(key=lambda x:x[2]) #排序
res=0
path=[]
def find(father,f):
while father[f]>0:
f=father[f]
return f
father={i:0 for i in range(m)}
for i in range(n):
node1= find(father,a[i][0])
node2= find(father,a[i][1])
if node1 != node2:
father[node1] = node2
res+=a[i][2]
path.append((a[i][0],a[i][1],a[i][2]))
if len(path) == m-1:
break
output = open('output.txt','w+')
output.write(str(res))
output.write('\n')
for i in range(len(path)):
for j in range(len(path[i])):
output.write(str(path[i][j]))
output.write(' ')
output.write('\n')
output.close()
自我感觉做的还是麻烦了,恳请大家多多指正吖(●'◡'●)