Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9435 | Accepted: 2704 |
Description
Farmer John had just acquired several new farms! He wants to connect the farms with roads so that he can travel from any farm to any other farm via a sequence of roads; roads already connect some of the farms.
Each of the N (1 ≤ N ≤ 1,000) farms (conveniently numbered 1..N) is represented by a position (Xi, Yi) on the plane (0 ≤ Xi ≤ 1,000,000; 0 ≤ Yi ≤ 1,000,000). Given the preexisting M roads (1 ≤ M ≤ 1,000) as pairs of connected farms, help Farmer John determine the smallest length of additional roads he must build to connect all his farms.
Input
* Line 1: Two space-separated integers: N and M
* Lines 2..N+1: Two space-separated integers: Xi and Yi
* Lines N+2..N+M+2: Two space-separated integers: i and j, indicating that there is already a road connecting the farm i and farm j.
Output
* Line 1: Smallest length of additional roads required to connect all farms, printed without rounding to two decimal places. Be sure to calculate distances as 64-bit floating point numbers.
Sample Input
4 1 1 1 3 1 2 3 4 3 1 4
Sample Output
4.00
Source
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
#define MAXV 1005
#define INF 1e12
const int start = 1;
bool visit[MAXV] = { false };
double dist[MAXV];
int preNode[MAXV];
double graph[MAXV][MAXV];
int vertex_size;
int road_size;
struct Point{
double x;
double y;
};
Point pointArr[MAXV];
double calDist( Point a, Point b ){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void prim(){
double res = 0.0;
int nextIndex;
int temp_node_num = vertex_size;
for( int index = 1; index <= vertex_size; ++index )
dist[index] = graph[1][index];
for( int count_num = 1; count_num <= vertex_size; ++count_num ){
double minDistance = INF;
int i;
for( i = 1; i <= vertex_size; ++i ){
if( minDistance > dist[i] && !visit[i] ){
minDistance = dist[i];
nextIndex = i;
}
}
visit[nextIndex] = true;
for( i = 1; i <= vertex_size; ++i ){
if( graph[nextIndex][i] < dist[i] && !visit[i] )
dist[i] = graph[nextIndex][i];
}
}
for( int i = 1; i <= vertex_size; ++i ){
if( dist[i] != -1 )
res += dist[i];
}
printf( "%.2lf\n", res );
}
void init(){
cin >> vertex_size >> road_size;
int i, j;
for( i = 1; i <= vertex_size; ++i )
cin>>pointArr[i].x>>pointArr[i].y;
for( i = 1; i <= vertex_size; ++i ){
for( j = 1; j <= vertex_size; ++j ){
graph[i][j] = graph[j][i] = calDist( pointArr[i], pointArr[j] );
}
}
for( i = 1; i <= road_size; ++i ){
int startPoint, endPoint;
cin >> startPoint >> endPoint;
graph[startPoint][endPoint] = -1;
graph[endPoint][startPoint] = -1;
}
}
int main(){
init();
prim();
return 0;
}