Python 从txt文件中读取文本写入列表再输出txt文件(最小生成树)

目录

前言

一、最小生成树

二、python对文件进行读写操作

1.将从文件读取数据并存入二维列表

2.将字符型列表转换成int型

3.单独读入第一行内容

4.跳过第一行内容读入

5.将二维列表写入文件

总结


前言

在用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()

自我感觉做的还是麻烦了,恳请大家多多指正吖(●'◡'●)

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值