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
用LUA(和C++)刷PAT (Advanced Level) ——1072 Gas Station
最新推荐文章于 2024-09-07 06:14:53 发布