這題說的是n個城市 建路 使他們聯通然後 , 可以使用一條超級的路這條路不計入總長,此時路長度為b, 這條路鏈結的兩個城市人口與和為a+b, 然後計算出最大的a/b
解題先生成一顆最小生成樹,然後 計算出這顆樹上每兩個節點之間要經過的最長的那條路,然後列舉每兩個節點u 個v 求出答案
1 #include 2 #include 3 #include 4 #include 5 #include6 #include 7
using
namespace
std;
8const
int maxn =1000+5;9
struct
edge
15};
16 vectore;
17struct
pointloc[maxn];
20int
p[maxn],fa[maxn];
21double
maxcost[maxn][maxn];
22struct
ed;25 vectorg[ maxn ];
26int fid(int
u)29 vectoruse;
30void dfs(int u, int per,double
cost)
35use.push_back(u);
36for(int i =0; i < (int)g[u].size() ; i++)40}
41double distends(double x1, double y1, double x2, double
y2)44
intmain()
4555
e.clear();
56for(int i=0; i < n; i++)
57for(int j = i+1; j < n; j++) );60}
61sort(e.begin() , e.end());
62double sum_dist=0;63
int ge=n;
64for(int i =0; i<(int)e.size(); i++) ); g[v].push_back( (ed) );
70 fa[ fu ] =fv;
71 sum_dist+=dist;
72 ge--; if(ge==1) break;73
}74}75 memset(maxcost,0,sizeof
(maxcost));
76use.clear();
77 dfs(0,-1,0.0
);78
double ans =0;79
for(int i =0; i)
80for(int j =i+1 ; j)85}
86 printf("
%.2f\n
",ans);87}
88return0;
89 }
最小生成樹演算法及例題
什麼是生成樹?對連通圖進行遍歷,過程中經過的點和邊的組合可看成一棵樹,也叫生成樹 kruskal演算法 世界上有著許許多多的鐵路線 公路線,想要從乙個城市到另乙個城市修一條線路需要許多資金,當然,修路的方式有多種多樣,現在我們想知道如何修路能使得這些城市之間形成乙個通訊網,並且使得總耗費最少呢?如何...
uva 10397 最小生成樹
這道題是最小生成樹樹的變形。題目告訴你在其中已經新增過了一些邊,在剩下的邊中選取若干條使其成為乙個最小生成樹。我記得上一次做真題是遇到類似的問題。我用了prime演算法求解。現在就換用了kruskal演算法。根據查詢選把相應邊合併,這些邊不算入雖小生成樹的權值即可,接下來的就和kruskal演算法一...
Kruskal最小生成樹 演算法模板 例題
已知連通圖g 圖上有n個頂點。生成樹是指圖g的乙個極小 邊最少 連通子圖,生成樹上有n個頂點 n 1條邊,且任意兩點之間都是連通的。最小生成樹 已知帶權連通圖g,圖中有n個頂點,每條邊都有權值。我們要從圖中抽出一棵生成樹,使得樹上所有邊權之和最小,這棵生成樹就叫做 最小生成樹。常見變形應用 1.要求...