2 条题解

  • 1
    @ 2026-4-3 21:40:11
    #include<iostream>
    #include<fstream>
    #include<iomanip>
    #include<stdio.h>
    #include<cstdio>
    #include<math.h>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstring>
    #include<string.h>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<map>
    #include<set>
    #include<cstdlib>
    #include<stdlib.h>
    #include<ctime>
    #include<time.h>
    using namespace std;
    #define LL long long
    const int N=1e5+5;
    const int INF=0x3f3f3f3f;
    int T,n,m,cnt,num;
    double ans;
    int xx[1100],yy[1100];
    int fa[1100];
    struct node{
    	int x,y;
    	double z;
    }edg[6001000];
    int find(int x){
    	return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    bool cmp(node a,node b){
    	return a.z<b.z;
    }
    void init(){
    	num=1;
    	for(int i=1;i<=m;i++){
    		for(int j=1;j<=m;j++){
    			if(i==j){
    				continue;
    			}
    			edg[num].x=i;
    			edg[num].y=j;
    			edg[num].z=sqrt(1.0*pow(xx[i]-xx[j],2)+pow(yy[i]-yy[j],2));
    			num++;
    		}
    	}
    	num--;
    	sort(edg+1,edg+num+1,cmp);
    	for(int i=1;i<=m;i++){
    		fa[i]=i;
    	}
    }
    void kruskal(){
    	int xx,yy;
    	for(int i=1;i<=num;i++){
    		xx=find(edg[i].x);
    		yy=find(edg[i].y);
    		if(xx!=yy){
    			cnt++;
    			fa[xx]=yy;
    			ans=edg[i].z;
    		}
    		if(cnt==m-n){
    			break;
    		}
    	}
    }
    int main(){
    	/*
    	freopen(".in","r",stdin);
    	freopen(".out","w",stdout);
    	*/
    	cin>>T;
    	while(T--){
    		memset(edg,0,sizeof(edg));
    		cin>>n>>m;
    		cnt=0;
    		for(int i=1;i<=m;i++){
    			cin>>xx[i]>>yy[i];
    		}
    		init();
    		kruskal();
    		cout<<fixed<<setprecision(2)<<ans<<endl;
    	}
    	return 0;
    }
    
    
    • 1
      @ 2022-10-23 15:20:38
      #include<iostream>
      #include<fstream>
      #include<iomanip>
      #include<stdio.h>
      #include<cstdio>
      #include<math.h>
      #include<cmath>
      #include<algorithm>
      #include<string>
      #include<cstring>
      #include<string.h>
      #include<vector>
      #include<stack>
      #include<queue>
      #include<map>
      #include<set>
      #include<cstdlib>
      #include<stdlib.h>
      #include<ctime>
      #include<time.h>
      using namespace std;
      #define LL long long
      const int N=1e5+5;
      const int INF=0x3f3f3f3f;
      int T,n,m,cnt,num;
      double ans;
      int xx[1100],yy[1100];
      int fa[1100];
      struct node{
      	int x,y;
      	double z;
      }edg[6001000];
      int find(int x){
      	return fa[x]==x?x:fa[x]=find(fa[x]);
      }
      bool cmp(node a,node b){
      	return a.z<b.z;
      }
      void init(){
      	num=1;
      	for(int i=1;i<=m;i++){
      		for(int j=1;j<=m;j++){
      			if(i==j){
      				continue;
      			}
      			edg[num].x=i;
      			edg[num].y=j;
      			edg[num].z=sqrt(1.0*pow(xx[i]-xx[j],2)+pow(yy[i]-yy[j],2));
      			num++;
      		}
      	}
      	num--;
      	sort(edg+1,edg+num+1,cmp);
      	for(int i=1;i<=m;i++){
      		fa[i]=i;
      	}
      }
      void kruskal(){
      	int xx,yy;
      	for(int i=1;i<=num;i++){
      		xx=find(edg[i].x);
      		yy=find(edg[i].y);
      		if(xx!=yy){
      			cnt++;
      			fa[xx]=yy;
      			ans=edg[i].z;
      		}
      		if(cnt==m-n){
      			break;
      		}
      	}
      }
      int main(){
      	/*
      	freopen(".in","r",stdin);
      	freopen(".out","w",stdout);
      	*/
      	cin>>T;
      	while(T--){
      		memset(edg,0,sizeof(edg));
      		cin>>n>>m;
      		cnt=0;
      		for(int i=1;i<=m;i++){
      			cin>>xx[i]>>yy[i];
      		}
      		init();
      		kruskal();
      		cout<<fixed<<setprecision(2)<<ans<<endl;
      	}
      	return 0;
      }
      
      • 1

      信息

      ID
      297
      时间
      1000ms
      内存
      128MiB
      难度
      5
      标签
      递交数
      72
      已通过
      29
      上传者