不懂就问
查看原帖
不懂就问
1091476
sdnu23ljd楼主2023/11/18 11:31

不懂就问。。。我用的Prim , 代码很简单。。。 可是。。。为什么。。。WA了#8.。。呜呜呜~求捞

//本题尽管是完全图,但是貌似用Kruskal算法(1e6)就能过
//还是用Prim练练手吧(似乎并没有什么时间优势)
#include <bits/stdc++.h>
using namespace std ;

const int N=1200 ;
const double INF=0x42;
int n , m ; 
double g[N][N] , h[520];
double x[N] , y[N] ;
double dist[N] ; //某结点距离集合的距离,合并时加入res(该题不用res)
int st[N]={0} ;
double prim(){
    memset(dist , INF , sizeof dist) ;
    double maxx=0 ;
    for(int i=0 ; i<n ; ++i){//n次循环,(n-1)次合并
        int t=-1 ; 
        for(int j =1 ; j<=n ; j++){
            if(!st[j] && (t==-1 || dist[j]<dist[t])){
                t=j ;//将距离最近的点并入集合
            }
        }
        if(i && dist[t]==INF)
            return INF ;
        if(i)
            maxx=max(maxx , dist[t]) ;
        st[t]= 1 ;
        for(int j=1 ; j<=n ; ++j){
            dist[j] = min(dist[j] , g[t][j]) ;
        }
    }
    return maxx ;
}

signed main(){
    memset(g , INF , sizeof g) ;
    cin>>m ;
    for(int i=1 ; i<=m ; ++i){
        cin>>h[i] ;
    }
    cin>>n ;
    for(int i=1 ; i<=n ; ++i){
        cin>>x[i]>>y[i] ;
    }
    for(int i=1 ; i<=n-1 ; ++i){
        for(int j=i+1 ; j<=n ; ++j){
            double dis=sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j])) ;
            g[i][j] = dis ;
            g[j][i] = dis ;
        }
    }

    double t=prim() ;
    int cnt=0 ;
    for(int i=1 ; i<=m ; ++i){
        if(h[i] >= t )  cnt++ ;
    }
    cout<<cnt<<endl ;
    /*for(int i=1 ; i<=m ; ++i){
        cout<<h[i]<<' ' ;
    }*/
    //cout<<t<<endl ;
    /*for(int i=1 ; i<=n ; ++i){
        for(int j=1 ; j<=n ; ++j){
            cout<<g[i][j]<<' ' ;
        }
        cout<<'\n' ;
    }*/
    system("pause") ;
    return 0 ;
}
2023/11/18 11:31
加载中...