模板 最小生成樹

2021-10-08 23:58:09 字數 2213 閱讀 3218

o(m

logm

)o(mlogm)

o(mlog

m)

#include

using

namespace std;

const

int n=

10005

;struct rece[n]

;bool

operator

<

(rec a,rec b)

void

read

(int

&x)while

(c>=

'0'&&c<=

'9')

x*=f;

}int n,m,fa[n]

;long

long ans;

intfind

(int x)

void

kruskal()

}}intmain()

kruskal()

;printf

("%lld"

,ans)

;}

o(n

2)

o(n^2)

o(n2

)

#include

using

namespace std;

const

int n=

105;

void

read

(int

&x)while

(c>=

'0'&&c<=

'9')

x*=f;

}int n,d[n]

,a[n]

[n],ans;

bool v[n]

;void

prim()

v[x]=1

;for

(int y=

1;y<=n;y++)}

}int

main()

}prim()

;for

(int i=

1;i<=n;i++

) ans+

=d[i]

;printf

("%d"

,ans)

;}

分析:本題肯定和最小生成樹有關,給了k個通訊衛星,這k個點是不用與其他點聯通的。仿照kru

skal

kruskal

kruska

l演算法,依次考慮最短的邊,同時記錄當前的連通塊數量。若x=y

x=yx=

y,則跳過;否則,令tot

−−

tot--

tot−

−.若tot

=k

tot=k

tot=

k,說明剩下的點可以用通訊衛星連線,直接輸出當前邊的長度,就是最小的d值。

證明如下:若連線當前最短的邊,對後面的邊最多只有乙個邊無法被選擇(因為只占用了乙個點),而這個當前最短的邊顯然是比後面的邊更優的。整個思想是貪心。

#include

#include

#include

using

namespace std;

const

int maxn=

505*

505;

struct recedge[maxn]

;bool

operator

<

(rec a,rec b)

void

read

(int

&x)while

(c>=

'0'&&c<=

'9')

x*=f;

}int k,n,m,fa[maxn]

,xi[maxn]

,yi[maxn]

,tot,index;

double f[maxn]

;int

get(

int x)

intmain()

}sort

(edge+

1,edge+m+1)

;for

(int i=

1;i<=n;i++

) fa[i]

=i; tot=n;

if(tot<=k)

for(

int i=

1;i<=m;i++)}

}}

最小生成樹模板

prim演算法理解可以參考部落格 prim演算法模板 int prime int v int i,j,sum 0,min,k sum是權重和 for i 1 i n i lowcost i 表明當前狀態下在u內距離v點 s中各點 距離的最小值,每個u中點s 中點 都計算 lowcost i map ...

最小生成樹 模板

const int maxn 1010 const int maxm 200020 struct edge edges maxm int father maxn int find int x int cmp edge a,edge b 將邊按權值排序 int kruskal int n,int m ...

模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出...