to 洛谷.1265 公路修建
某國有n個城市,它們互相之間沒有公路相通,因此交通十分不便。為解決這一「行路難」的問題,**決定修建公路。修建公路的任務由各城市共同完成。
修建工程分若干輪完成。在每一輪中,每個城市選擇乙個與它最近的城市,申請修建通往該城市的公路。**負責審批這些申請以決定是否同意修建。
**審批的規則如下:
(1)如果兩個或以上城市申請修建同一條公路,則讓它們共同修建;
(2)如果三個或以上的城市申請修建的公路成環。如下圖,a申請修建公路ab,b申請修建公路bc,c申請修建公路ca。則**將否決其中最短的一條公路的修建申請;
(3)其他情況的申請一律同意。
當所有城市被組合成乙個「城市聯盟」時,修建工程也就完成了。
你的任務是根據城市的分布和前面講到的規則,計算出將要修建的公路總長度。
輸入格式:
第一行乙個整數n,表示城市的數量。(n≤5000)
以下n行,每行兩個整數x和y,表示乙個城市的座標。(-1000000≤x,y≤1000000)
輸出格式:
乙個實數,四捨五入保留兩位小數,表示公路總長。(保證有惟一解)
輸入樣例#1:
4輸出樣例#1:0 01 2
-1 2
0 4
6.47修建的公路如圖所示:
![](https://pic.w3help.cc/481/7f214236ae0771e652414e6f8963e.jpeg)
規則2是沒有用的,因為不可能存在三個及以上個城市形成環。按「輪」處理也沒有必要,因此這就成了一道求最小生成樹的題。
如果用kruskal需用5000*5000的矩陣先計算出邊,肯定是超記憶體的。所以選擇prim,在求最小生成樹過程中計算兩點距離。
1 #include2 #include3using
namespace
std;
4const
int n=5005;5
6int
n,x[n],y[n];
7double
ans,min[n];
8bool
vis[n];910
void read(int &now)
1118
while(c>='
0'&&c<='
9')now=(now<<3)+(now<<1)+c-'
0',c=getchar();
19 now= f?-now:now;20}
2122
double calu(int a1,int b1,int a2,int
b2)23
2728
intmain()
2942 vis[cur]=1
;43 ans+=k;
44for(int j=1;j<=n;++j)
4551
}52 printf("
%.2lf
",ans);
53return0;
54 }
洛谷 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 如果兩個或以上城市...