最小生成树
\(T1:\)北极通信网络
只需要在最后计算时把卫星减掉即可,注意:输出最大边长,多测要清空!
//#pragma GCC optimize("O2")
#include<bits/stdc++.h>
using namespace std;
int n,m;
int fa[1000010];
double node[1010][2];
int cnt;
struct eg{
int l,r;
double w;
bool operator <(const eg &W)const{
return w<W.w;
}
}a[1000010];
int find_fa(int x){
if(fa[x]==x){
return fa[x];
}
return fa[x]=find_fa(fa[x]);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T;
cin>>T;
while(T--){
memset(fa,0,sizeof fa);
cnt=0;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>node[i][0]>>node[i][1];
}
for(int i=1;i<=m;i++){
for(int j=i+1;j<=m;j++){
a[++cnt].l=i;
a[cnt].r=j;
a[cnt].w=sqrt((node[i][0]-node[j][0])*(node[i][0]-node[j][0])+(node[i][1]-node[j][1])*(node[i][1]-node[j][1]));
}
}
sort(a+1,a+cnt+1);
for(int i=1;i<=m;i++){
fa[i]=i;
}
int tot=0;
for(int i=1;i<=cnt;i++){
int fl=find_fa(a[i].l),fr=find_fa(a[i].r);
if(fl!=fr){
fa[fl]=fr;
tot++;
if(tot==m-n){
cout<<fixed<<setprecision(2)<<a[i].w<<"\n";
}
}
}
}
return 0;
}
\(T2:\)新的开始
把发电站放到0号点上,当超级原点。注意:最后输出要求变成\(tot==n\)而不是\(tot==n-1\)
//#pragma GCC optimize("O2")
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
int fa[100010];
struct node{
int l,r,w;
bool operator <(const node &W)const{
return w<W.w;
}
}a[100010];
int v[100010];
int find_fa(int x){
if(fa[x]==x){
return fa[x];
}
return fa[x]=find_fa(fa[x]);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=n;i++){
cin>>v[i];
a[++cnt].l=0;
a[cnt].r=i;
a[cnt].w=v[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[++cnt].l=i;
a[cnt].r=j;
cin>>a[cnt].w;
}
}
sort(a+1,a+cnt+1);
int ans=0,tot=0;
for(int i=1;i<=cnt;i++){
int fl=find_fa(a[i].l),fr=find_fa(a[i].r);
if(fl!=fr){
fa[fl]=fr;
tot++;
ans+=a[i].w;
}
if(tot==n){
cout<<ans;
return 0;
}
}
return 0;
}