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 輸出格式 輸出...