北航演算法作業三

2021-09-08 04:22:09 字數 2414 閱讀 9876

有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規格了。而其實規格就像是乙個指導你具體實現方法的說明書,它會為你指定這個方法的前置後置條...