P1265 公路修建

2022-08-12 23:42:13 字數 1058 閱讀 5442

雖然prim跟dij是差不多的,但是兩者還是有一點點差別。

就像我這種菜雞,只會dij,結果寫出來的prim奇怪得很。

這道題我還特意寫了個堆優化,但是也沒快到那兒去。。。

首先如何看出這是最小生成樹的裸題?

在每一輪中,每個城市選擇乙個與它最近的城市,申請修建通往該城市的公路。這就是prim的做法。

如果三個或以上的城市申請修建的公路成環。如下圖,a申請修建公路ab,b申請修建公路bc,c申請修建公路ca。則**將否決其中最短的一條公路的修建申請。

第二個條件有點東西,它確保答案是沒有環的。

但是這為什麼就是最小生成樹呢?

顯然,因為他們想修建這些公路,所以ab>ac,bc>ba,ca>cb。

合起來就是ab>=ac,bc>=ab,ac>=bc。

當且僅當這三者相等的時候不等式組成立,而隨便去掉乙個都沒有影響。

所以接下來的任務就是套上prim演算法了。

當然不用kruskal演算法了,因為邊太多了!

這裡使用堆優化的prim,還可以。

**:

#include#include#includeconst int maxn = 5005;

struct nodes

s[maxn];

double dist[maxn];

bool vis[maxn];

double ans;

int n;

struct heapnodes

bool operator < (const heapnodes &rhs) const

};int read()

while(ch >= '0' && ch <= '9') ans = (ans << 3) + (ans << 1) + ch - '0', ch = getchar();

return s * ans;

}double dis(int a, int b)// 直接人工算距離就可以了

void prim()

while(!heap.empty())}}

}}int main()

洛谷 P1265 公路修建

本題的描述 城市聯盟,最短距離。使人想到了prim求mst,再一看資料範圍 完全圖!那麼一定得用prim,因為只有5000個點,所以不加優化的prim就能過。include include include include include include using namespace std con...

洛谷P1265 公路修建

太長不看版 給你乙個數字n,接下來是n個點的x y座標,求個最小生成樹 某國有n個城市,它們互相之間沒有公路相通,因此交通十分不便。為解決這一 行路難 的問題,決定修建公路。修建公路的任務由各城市共同完成。修建工程分若干輪完成。在每一輪中,每個城市選擇乙個與它最近的城市,申請修建通往該城市的公路。負...

洛谷P1265 公路修建題解

某國有n個城市,它們互相之間沒有公路相通,因此交通十分不便。為解決這一 行路難 的問題,決定修建公路。修建公路的任務由各城市共同完成。修建工程分若干輪完成。在每一輪中,每個城市選擇乙個與它最近的城市,申請修建通往該城市的公路。負責審批這些申請以決定是否同意修建。審批的規則如下 1 如果兩個或以上城市...