PAT 1030.Travel Plan

非常经典的寻路问题,用一般的dfs思路,全局记录当前路径信息和最优路径信息,即可很简单的写出代码。

import sys
import copy
(N,M,S,D)=(int(x) for x in raw_input().split())
Map=[[-1 for x in range(N)] for y in range(N)]
Cost=[[-1 for x in range(N)] for y in range(N)]
for i in range(M):
	line=raw_input().split()
	a=int(line[0])
	b=int(line[1])
	dis=int(line[2])
	cost=int(line[3])
	Map[a][b]=dis
	Map[b][a]=dis
	Cost[a][b]=cost
	Cost[b][a]=cost

isReached=[False for x in range(N)]
curPath=[S]
minPath=[]
curDis=0
minDis=sys.maxint
curCost=0
minCost=sys.maxint

def dfs(cur):
	global isReached,curPath,minPath,curDis,minDis,curCost,minCost
	if cur==D:
		#reach
		if curDis<minDis:
			minDis=curDis
			minPath=copy.deepcopy(curPath)
			minCost=curCost
		elif curDis==minDis:
			if curCost<minCost:
				minCost=curCost
				minPath=copy.deepcopy(curPath)
		return
	for i in range(N):
		if not isReached[i] and Map[cur][i]!=-1:
			#dfs
			isReached[i]=True
			curDis+=Map[cur][i]
			curCost+=Cost[cur][i]
			curPath.append(i)
			dfs(i)
			del curPath[-1]
			curCost-=Cost[cur][i]
			curDis-=Map[cur][i]
			isReached[i]=False
		
dfs(S)
for i in minPath:
	print i,
print minDis,minCost


转载于:https://my.oschina.net/superpdm/blog/173712

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值