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 4Sample Output
4.00Source
USACO 2007 December Silver
思路:实际上这道题并不是很难,然后通过这道题目有学到了一个新的技能,用c++提交double输出%lf,G++提交double输出%f。
#include <cstdio> #include <cmath> #include <cstring> #define INF 0x3f3f3f3f using namespace std; struct node{ double x,y; }point[1005]; long long n,m; long long vis[1005]; double dis[1005],a[1005][1005],ans=0; double distance(double x1, double y1, double x2, double y2){ return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); } void Prim(){ for(int i = 1; i <= n; i ++){ dis[i] = a[1][i]; vis[i] = 0; } vis[1] = 1; double _min; int k; for(int i = 1; i < n; i ++){ _min = INF; k = 0; for(int j = 1; j <= n; j ++){ if(!vis[j] && dis[j] < _min){ _min = dis[j]; k = j; } } ans += _min; vis[k] = 1; for(int j = 1; j <= n;j ++){ if(!vis[j] && dis[j] > a[k][j]) dis[j] = a[k][j]; } } } int main(){ while(~scanf("%lld%lld",&n,&m)){ for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) a[i][j] = i == j ? 0 : INF; int u,v; for(int i = 1; i <= n; i ++){ scanf("%lf%lf",&point[i].x,&point[i].y); } for(int i = 1; i <= n; i ++){ for(int j = i + 1; j <= n; j ++) a[i][j] = a[j][i] = distance(point[i].x,point[i].y,point[j].x,point[j].y); } for(int i = 1; i <= m; i ++){ scanf("%d%d",&u,&v); a[u][v] = a[v][u] = 0; } ans = 0; Prim(); printf("%.2lf\n",ans); } return 0; }