雖然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 如果兩個或以上城市...