某國有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修建的公路如圖所示:
解析:mst裸題(不接受挨打)
由於是稠密圖,所以採用了prim演算法
(稀疏圖最好用克魯斯卡爾)
對任意兩個點都求出距離
然後對其跑一遍最小生成樹
但是注意n的範圍是5000,而大小限制為125mb
題目本身不難,但是會一直mle,所以需要優化
我這裡有三個**,不同的分數
第乙個是裸的開 5000*5000 double陣列的prim演算法可以跑出80分的好成績(不開o2)。、
第二個是裸的克魯斯卡爾演算法,不開o2估計70分,開了o2穩定80分,運氣好的話就是90分
第三個就是prim,與第乙個prim不同的是會減少大量的冗餘運算,具體體現就是把 5000 * 5000 的陣列取消掉
只會在需要計算的時候才會計算,將大大減少時間和記憶體,,,所以就ac了。
1 #include2 #include3 #include4 #include5 #include80分裸的prim6 #include7 #include8 #include9 #include10 #include
11 #include12 #include13 #include14
#define ll long long
15#define re register
16#define inf 0x7fffffff
17#define max 5002
18#define d double
19 inline int
read()
2023
while(ch>='
0'&&ch<='
9') s=s*10+ch-'
0',ch=getchar();
24return s*f;25}
26int n;d ans=0.0
,g[max][max],dis[max];
27bool vis[max]=;
28struct
edge t[max];
31d dis(d x1,d y1,d x2,d y2)
3235
intmain()
3650 vis[pos]=1
;51 ans+=dis[pos];
52for(re int j = 1 ; j <= n ; ++j) 56}
57 printf("
%.2lf
",ans);
58return0;
59 }
1開o2或許是90分或許是80分,看你是否臉黑//luogu-judger-enable-o2
2 #include3 #include4 #include5 #include6 #include
7 #include8 #include9 #include10 #include11 #include
12 #include13 #include14 #include15
#define ll long long
16#define re register
17#define max 5000*5000/2
18#define d double
19 inline int
read()
2023
while(ch>='
0'&&ch<='
9') s=s*10+ch-'
0',ch=getchar();
24return s*f;25}
26int n,pa[max];d ans=0;27
struct
edge t[max];
30struct
dis
36}e[max];
37int find(int
x)38
42void join(int x,int
y)43
47d dis(d x1,d y1,d x2,d y2)
4851
intmain()
5265 printf("
%.2lf
",ans);
66return0;
67 }
1 #include2 #include3 #include4 #include5 #includeac **6 #include7 #include8 #include9 #include10 #include
11 #include12 #include13 #include14
#define ll long long
15#define re register
16#define inf 0x7fffffff
17#define max 5002
18#define d double
19 inline int
read()
2023
while(ch>='
0'&&ch<='
9') s=s*10+ch-'
0',ch=getchar();
24return s*f;25}
26int n;d ans=0.0
,dis[max];
27bool vis[max]=;
28struct
edge t[max];
29 d dis(d x1,d y1,d x2,d y2)
30int
main()
3146
}47 printf("
%.2lf
",ans);
48return0;
49 }
洛谷 P1265 公路修建
本題的描述 城市聯盟,最短距離。使人想到了prim求mst,再一看資料範圍 完全圖!那麼一定得用prim,因為只有5000個點,所以不加優化的prim就能過。include include include include include include using namespace std con...
洛谷P1265 公路修建
太長不看版 給你乙個數字n,接下來是n個點的x y座標,求個最小生成樹 某國有n個城市,它們互相之間沒有公路相通,因此交通十分不便。為解決這一 行路難 的問題,決定修建公路。修建公路的任務由各城市共同完成。修建工程分若干輪完成。在每一輪中,每個城市選擇乙個與它最近的城市,申請修建通往該城市的公路。負...
洛谷P1265 公路修建(Prim)
to 洛谷.1265 公路修建 某國有n個城市,它們互相之間沒有公路相通,因此交通十分不便。為解決這一 行路難 的問題,決定修建公路。修建公路的任務由各城市共同完成。修建工程分若干輪完成。在每一輪中,每個城市選擇乙個與它最近的城市,申請修建通往該城市的公路。負責審批這些申請以決定是否同意修建。審批的...