有50個城市,知道各個城市之間的距離(乙個50*50的矩陣,有向圖),知道各條路徑上的過路費(乙個50*50的矩陣,有向圖).問在過路費不超過1500的情況下,從0號城市走到49號城市的最短路徑.要求用分支限界法
深度優先可以遞迴實現(區區50,不會爆棧),也可以自定義乙個棧來實現.
import queue
class node:
def __init__(self, city_number, now_cost, now_dis, path):
self.city, self.cost, self.dis, self.path = city_number, now_cost, now_dis, path
def __lt__(self, other):
return self.dis < other.dis
def matrixfromfile(filename):
return [[int(value) for value in line.split()] for line in open(filename, "r")]
def floyd(g):
a = [[g[i][j] for j in range(n)] for i in range(n)]
for i in range(n): a[i][i] = 0
for i in range(n):
for j in range(n):
for k in range(n):
a[j][k] = min(a[j][k], a[j][i] + a[i][k])
return a
def bfs():
q = queue.priorityqueue()
q.put(node(0, 0, 0, "0"))
# 只有一開始的這個上界不知道怎麼求,如果設定的太大,效率太低
min_node = node(0, 0, 500, "no answer")
while q.qsize():
now = q.get()
print(now.path, now.dis, q.qsize())
if now.dis > min_node.dis: break
for i in range(n):
if now.path.find(str(i)) != -1: continue
next = node(i, now.cost + cost[now.city][i], now.dis + dis[now.city][i], now.path + "->" + str(i))
if next.cost + floyd_cost[i][aim] > cost_bound or next.dis + floyd_dis[i][aim] > min_node.dis: continue
if next.city == aim:
min_node = next
continue
q.put(next)
return min_node
def dfs(now, now_dis, now_cost, vis, path):
global min_dis
if now == aim:
min_dis = now_dis
print(path, "dis:{} cost:{}".format(now_dis, now_cost))
vis[now] = true
for i in range(n):
if vis[i]: continue
if now_dis + dis[now][i] + floyd_dis[i][aim] > min_dis or now_cost + cost[now][i] + floyd_cost[i][
aim] > cost_bound: continue
dfs(i, now_dis + dis[now][i], now_cost + cost[now][i], vis, path + "->" + str(i))
vis[now] = false
dis = matrixfromfile("m1.txt")
cost = matrixfromfile("m2.txt")
n = len(dis)
floyd_dis = floyd(dis)
floyd_cost = floyd(cost)
aim = n - 1
cost_bound = 1500
# 深度優先
min_dis = 9999
dfs(0, 0, 0, [false] * n, "0")
# 廣度優先
# ans=bfs()
# print(ans.path, "dis={} cost={}".format(ans.dis, ans.cost))
演算法作業實驗三
105.最大欄位和 15分 c時間限制 3000 毫秒 c記憶體限制 3000 kb 題目內容 給定長度為n的整數序列,a 1.n 求 1,n 某個子區間 i j 使得a i a j 和最大.或者求出最大的這個和.例如 2,11,4,13,5,2 的最大子段和為20,所求子區間為 2,4 輸入描述 ...
北航oo作業第一單元小結
前言 在經過了三次艱辛的oo作業後,oo課程的第一單元告一段落,這一單元,我作為乙個oo小白,開始了解oo的程式設計思想,也有了自己的一點心得體會。把筆粗成字,不當之處,還請各位大佬多多指教。一.分析程式結構 第一次作業 在第一次作業中,由於剛剛開始接觸oo的思想,我還不是很了解物件導向的程式設計方...
北航OO第三單元總結
本單元作業為jml規格的學習與應用,要求我們在閱讀jml規格之後實現出完全符合規格要求的方法。當然在完成作業之前我又需要從0開始學習jml規格,但好在jml的入門難度並不大,短短幾個小時後就可以讀懂作業中的jml規格了。而其實規格就像是乙個指導你具體實現方法的說明書,它會為你指定這個方法的前置後置條...