用LUA(和C++)刷PAT (Advanced Level) ——1072 Gas Station

local readF = io.read('*a'):gmatch('%w+')

local N = readF() M = readF() K = readF() D = tonumber(readF())
local roads = {};
setmetatable(roads, {__index = function(t, v) t[v] = {} return t[v] end})
local num = nil min_D = -1 ava_D = -1;

function dij(number)
    local distance_table = {}
    local dij_table = {}
    local find_table = {}
    table.insert(dij_table, {number = number, distance = 0})
    
    while #dij_table > 0 do
        local node = dij_table[1] index = 1
        for i, n in pairs(dij_table) do
            if n.distance < node.distance then
                node = n
                index = i
            end
        end
        local current_node = table.remove(dij_table, index)
        if not string.find(current_node.number, "G") and (current_node.distance > D or current_node.distance < min_D) then
            return nil
        end
        distance_table[current_node.number] = current_node.distance
        for next_number, next_distance in pairs(roads[current_node.number]) do
            if not distance_table[next_number] then
                if find_table[next_number] then
                    find_table[next_number].distance = math.min(find_table[next_number].distance, current_node.distance + next_distance)
                else
                    new_node = {number = next_number, distance = current_node.distance + next_distance}
                    find_table[next_number] = new_node
                    table.insert(dij_table, new_node)
                end
            end
        end
    end
    
    local min_distance = 100000 ava_distance = 0
    
    for i = 1, N do
        if not distance_table[tostring(i)] then
            return nil
        end
        min_distance = math.min(min_distance, distance_table[tostring(i)])
        ava_distance = ava_distance + distance_table[tostring(i)]
    end
    ava_distance = ava_distance / N
    return min_distance, ava_distance
end

for i = 1, K do
    local p1 = readF() p2 = readF() dis = tonumber(readF())
    roads[p1][p2] = dis
    roads[p2][p1] = dis
end

for i = 1, M do
    local m, a = dij("G" .. i)
    if m and (m > min_D or (m == min_D and a < ava_D)) then
        min_D = m
        ava_D = a
        num = "G" .. i
    end
end

if num then
    print(num)
    print(string.format("%.1f", min_D + 0.005) .. " " .. string.format("%.1f", ava_D + 0.005))--lua的四舍五入会出错
else
    print("No Solution")
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值