SRM503 Div2 Hard(900) KingdomXCitiesandVillagesAnother
KingdomXCitiesandVillagesAnother
ちょっと違うけど、プリム法。短いものから貪欲に道路を追加していけば良い。
#include <vector> #include <cmath> using namespace std; double dist( int x1, int y1, int x2, int y2 ) { return sqrt(double(x1-x2)*(x1-x2)+double(y1-y2)*(y1-y2)); } class KingdomXCitiesandVillagesAnother{public: double determineLength( vector <int> cityX, vector <int> cityY, vector <int> villageX, vector <int> villageY ) { int N = (int)cityX.size(); int M = (int)villageX.size(); vector<bool> conn(M); double ans = 0; for ( int i=0; i<M; i++ ) { double mind = 1e100; int minv = 0; for ( int j=0; j<M; j++ ) if ( ! conn[j] ) { for ( int k=0; k<N; k++ ) { double d = dist(cityX[k],cityY[k],villageX[j],villageY[j]); if ( d < mind ) mind = d, minv = j; } for ( int k=0; k<M; k++ ) if ( conn[k] ) { double d = dist(villageX[k],villageY[k],villageX[j],villageY[j]); if ( d < mind ) mind = d, minv = j; } } ans += mind; conn[minv] = true; } return ans; }};