不懂就问。。。我用的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 ;
}