zoj 1914 || poj 2349 Arctic Network(Prim~)

给你点的坐标,计算最小生成树,然后算去掉给定数目的树上的最长边后的那条边。

 

我用的PRIM,先把边算出来,然后快排,再取题目要求的那条边。

 

我用qsort老不对。。。用sort对了。。。

 

排名很靠前,嘻嘻,不过,运行时间枕的是靠RP。。。

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <math.h> #include <algorithm> #include <iomanip> using namespace std; const int N = 501; int n,sat,map[N][N]; void input() { int coor[510][2]; cin >> sat >> n; for(int i=1; i<=n; i++) cin >> coor[i][0] >> coor[i][1]; for(int i=1; i<=n; i++) for(int k=1; k<=n; k++) map[i][k] = INT_MAX; for(int i=1; i<=n; i++) for(int k=1; k<=n; k++) map[i][k] = (coor[i][0]-coor[k][0])*(coor[i][0]-coor[k][0]) + (coor[i][1]-coor[k][1])*(coor[i][1]-coor[k][1]); } void prim() { int hash[N],dis[N],now,j,k; int put[N]; for(j=1; j<=n; j++) { dis[j] = INT_MAX; hash[j] = 0; put[j] = 0; } now = 1; hash[now]= 1; dis[now] = 0; int count = 0; for(k=1; k<n; k++) { for(j=1; j<=n; j++) if( !hash[j] && dis[j] > map[now][j] ) dis[j] = map[now][j]; int min = INT_MAX; for(j=1; j<=n; j++) if( !hash[j] && dis[j] < min ) min = dis[now=j]; hash[now] = 1; put[count] = min; count++; } sort(put,put+n); cout << setiosflags(ios::fixed) << setprecision(2) << sqrt((double)put[n-sat]) << endl; } int main(void) { int ncases; cin >> ncases; while( ncases-- ) { input(); prim(); } return 0; }  

 

 

你可能感兴趣的:(zoj 1914 || poj 2349 Arctic Network(Prim~))