【提高组】最小生成树

P1991 无线通讯网

#include<bits/stdc++.h>
#define For(i,l,r) for(int i=l;i<=r;i++) 
using namespace std;
const int N=505;
struct node{
    int t1,t2;double v;
}e[N*N];
struct NODE{
    double x,y;
}st[N];
int s,p,cnt,f[N],fa[N];
double ans;
inline double dis(int i,int j){
    return sqrt((st[i].x-st[j].x)*(st[i].x-st[j].x)+(st[i].y-st[j].y)*(st[i].y-st[j].y));
}
inline int getfa(int x){
    if(f[x]!=x) return getfa(f[x]);
    return x;
}
inline bool cmp(node x,node y){return x.v<y.v;}
int main(){
    scanf("%d%d",&s,&p);s=p-s;
    For(i,1,p) f[i]=i;
    For(i,1,p) scanf("%lf%lf",&st[i].x,&st[i].y);
    For(i,1,p){
        For(j,i+1,p){
            e[++cnt].t1=i,e[cnt].t2=j,e[cnt].v=dis(i,j);
        }
    }
    sort(e+1,e+cnt+1,cmp);int a,b;
    for(int i=1;i<=cnt,s>0;i++){
        a=e[i].t1,b=e[i].t2;
        fa[a]=getfa(a),fa[b]=getfa(b);
        if(fa[a]!=fa[b]){
            f[fa[a]]=fa[b];s--;ans=max(ans,e[i].v);
        }
    }
    printf("%.2lf",ans);
    return 0;
}
View Code

 

P1265 公路修建

#include<bits/stdc++.h>
#define For(i,l,r) for(int i=l;i<=r;i++)
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=5005;
int n,m;
ll d[N];
bool vis[N];
double ans;
struct node{
    ll x,y;
    ll operator*(const node &b)const{return (x-b.x)*(x-b.x)+(y-b.y)*(y-b.y);}
}c[N];
inline ll read(){
    ll f=1,sum=0;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){sum=(sum<<1)+(sum<<3)+(ch^48);ch=getchar();}
    return f*sum;
}
inline void prim(){
    memset(d,inf,sizeof(d));
    memset(vis,0,sizeof(vis));
    d[1]=0;
    For(i,1,n-1){
        int x=0;
        For(j,1,n){if(!vis[j]&&(x==0||d[j]<d[x])) x=j;}
        vis[x]=1;
        For(j,1,n) {if(!vis[j]) d[j]=min(d[j],c[x]*c[j]);}
    }
}
int main(){
    n=read();
    For(i,1,n){c[i].x=read(),c[i].y=read();}
    prim();
    For(i,1,n) ans+=sqrt((double)d[i]);
    printf("%.2f\n",ans);
    return 0;
}
View Code

 

posted @ 2019-10-12 15:49  jian_song  阅读(102)  评论(0编辑  收藏  举报