洛谷P1265 公路修建題解

2022-03-14 22:28:06 字數 3731 閱讀 9411

某國有n個城市,它們互相之間沒有公路相通,因此交通十分不便。為解決這一「行路難」的問題,**決定修建公路。修建公路的任務由各城市共同完成。

修建工程分若干輪完成。在每一輪中,每個城市選擇乙個與它最近的城市,申請修建通往該城市的公路。**負責審批這些申請以決定是否同意修建。

**審批的規則如下:

(1)如果兩個或以上城市申請修建同一條公路,則讓它們共同修建;

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

(3)其他情況的申請一律同意。

當所有城市被組合成乙個「城市聯盟」時,修建工程也就完成了。

你的任務是根據城市的分布和前面講到的規則,計算出將要修建的公路總長度。

第一行乙個整數n,表示城市的數量。(n≤5000)

以下n行,每行兩個整數x和y,表示乙個城市的座標。(-1000000≤x,y≤1000000)

乙個實數,四捨五入保留兩位小數,表示公路總長。(保證有惟一解)

輸入 #1複製

4

0 01 2

-1 2

0 4

輸出 #1複製

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 #include

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

,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 }

80分裸的prim

1

//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 }

開o2或許是90分或許是80分,看你是否臉黑

1 #include2 #include3 #include4 #include5 #include

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 }

ac **

洛谷 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個城市,它們互相之間沒有公路相通,因此交通十分不便。為解決這一 行路難 的問題,決定修建公路。修建公路的任務由各城市共同完成。修建工程分若干輪完成。在每一輪中,每個城市選擇乙個與它最近的城市,申請修建通往該城市的公路。負責審批這些申請以決定是否同意修建。審批的...