LeetCode 1168 優化水資源分配

Mondo 科學 更新 2024-03-07

村里有n戶人家,我們可以挖井或建水管給每戶人家供水。

對於每個家庭,我們可以通過花水井[i]直接在他們家中挖井,或者通過水管將它們連線到其他井。 每兩戶家庭之間鋪設水管的成本由一系列管道表示。 pipes[i] = [house1, house2, cost] 表示在家庭 1 和 2 之間鋪設水管的成本是成本。

要求所有居民的最低水費。

示例 1:輸入:n = 3,井 = [1,2,2],管道 = [[1,2,1],[2,3,1]]。

輸出: 3 解釋:

the image shows the costs of connecting houses using pipes.

the best strategy is to build a well in the first house with cost 1 and connect the other houses to it with cost 2 so the total cost is 3.

提示:

1 <= n <= 10000

wells.length == n

0 <= wells[i] <= 10^5

1 <= pipes.length <= 10000

1 <= pipes[i][0], pipes[i][1] <= n

0 <= pipes[i][2] <= 10^5

pipes[i][0] != pipes[i][1]

圖 最小生成樹

問題,每個城市挖井要花一定的錢,也可以用其他城市的井水,城市之間修建連線管道也要花一定的錢,那麼怎麼安排所有城市的灌溉,花錢最少。

這是連線所有點的最短路徑 最小生成樹問題,它將城市視為圖中的點,將連線城市的管道視為連線兩點的邊。 這裡鑽井的成本是直接在點上,並不是所有的點都用邊連線,所以為了方便起見,我們可以假設乙個點(root)0,其中自積分的成本可以比較連線,成本可以0-i成本之間。 這使我們能夠構造乙個包含所有點和邊的連線圖。 在連通性圖中查詢最短路徑和最小生成樹的問題。

在擴充套件閱讀中,請參閱維基百科以獲取此類問題的幾種解決方案。

步驟:建立pojo edgecost(node1, node2, cost) - 節點 1 和節點 2 之間連線邊的成本。想象一下root構建乙個連線所有節點和[0,i] -i 是節點 [1,n]。它是乙個節點,則邊的值為節點i鑽井的成本wells[i];將鑽井成本和城市連線點轉換為圖形的節點和邊。 對圖形邊緣的值進行排序(從小到大),並遍歷圖形的邊緣以確定兩個節點是否連線 (union-find如果所有節點都連線,則獲取的最小路徑為最小成本,每次返回union、節點數n-1如果n==0指示所有節點都已連線,可以提前退出,而無需繼續訪問其餘邊。

在這裡,加權並集查詢用於確定兩個節點是否連線,以及節點是否連線。

例子:n = 5, wells=[1,2,2,3,2], pipes=[[1,2,1],[2,3,1],[4,5,7]]如圖所示

從圖中可以看出,所有節點都在最後連線。

複雜性分析

時間複雜度:o(eloge) -e 是圖形的邊數空間複雜度:o(e)

最多有乙個數字n(n-1) 2 - n 是圖中的節點數條帶邊(全連線圖形)。

構造乙個圖,獲取所有邊,對所有邊進行排序,遍歷所有邊(從小到大),對於每條邊,檢查它們是否連線,如果沒有,則在邊上新增值,連線兩個節點。 如果已連線,請跳過它。 j**a code

class optimizewaterdistribution for (int p : pipes) collections.sort(costs); int mincosts = 0; unionfind uf = new unionfind(n); for (edgecost edge : costs) return mincosts; }class edgecost implements comparable @override public int compareto(edgecost o) class unionfind rank = new int[n + 1]; public int find(int x) public void union(int x, int y) else }
pythong3 code

class solution: def mincosttosupplywater(self, n: int, wells: list[int], pipes: list[list[int]])int: union_find = def find(x): return x if x == union_find[x] else find(union_find[x]) def union(x, y): px = find(x) py = find(y) union_find[px] = py graph_wells = [[cost, 0, i] for i, cost in enumerate(wells, 1)] graph_pipes = [[cost, i, j] for i, j, cost in pipes] min_costs = 0 for cost, x, y in sorted(graph_wells + graph_pipes): if find(x) == find(y): continue union(x, y) min_costs += cost n -= 1 if n == 0: return min_costs
最短路徑問題:Dijkstra 演算法、Floyd-Warshall 演算法、Bellman-Ford 演算法、Kraskal 演算法、PRIM's 演算法最小生成樹。

相關問題答案

    水資源論證對水資源的作用和工作流程

    隨著社會的發展,人類對水資源的需求越來越大。然而,自然界中的水資源是有限的,因此我們必須明智地使用每一滴水,以確保水資源的可持續利用。水資源在這一過程中起著至關重要的作用。海景環保將詳細介紹水資源示範對水資源的作用和工作流程。.水資源論證的定義和作用。水資源論證是指通過科學的方法,對水資源的數量 質...

    如何珍惜水資源?

    珍惜水資源是乙個至關重要的話題,因為水是生命的源泉,對人類生命和生態系統的健康至關重要。以下是一些節約水資源的有效方法 節約用水 關掉不必要的水龍頭,例如刷牙或洗碗時。修理漏水的管道和水龍頭,防止浪費水。使用節水的衛生潔具,例如低流量馬桶和淋浴噴頭。高效用水 收集雨水用於澆灌植物或沖洗外部空間。使用...

    優化河道水資源配置,促進水資源節約集約利用

    總書記指出,推進中國式現代化建設,要兼顧水資源問題 進入新的發展階段,貫徹新發展理念,構建新的發展格局,形成統一的全國市場和國內暢通的迴圈,促進南北協調發展,都需要水資源的大力支援。總書記的重要論述深刻闡釋了高質量發展與高水平保護的辯證關係 人口經濟與資源環境的平衡關係 水資源與生產力的適應關係。要...

    沙地阿拉伯水資源概況

    沙地阿拉伯是乙個沙漠國家,沒有永久性的河流或湖泊,水資源稀缺。根據聯合國糧食及農業組織 FAO 年的資料,沙地阿拉伯年平均降水深度為公釐,年降水量約為億立方公尺,年地表水量約為億立方公尺,降水產生的長期年平均地下水補給量為億立方公尺,中國人均可再生水資源年總量為立方公尺。為了滿足生活和生產的需要,沙...

    如何節約用水?

    隨著人口的增長和經濟發展,對水資源的需求量越來越大,水資源短缺和水汙染越來越嚴重。水資源是人類生存和發展的基礎,因此如何節約水資源成為全球關注的焦點。首先,我們需要了解水資源的現狀。據統計,全球有多億人生活在缺水地區,水汙染已成為世界上最嚴重的問題之一。工業廢水 農業肥料和城市汙水都對水資源造成了極...