Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11366 | Accepted: 3224 |
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
思路:实际上这道题并不是很难,然后通过这道题目有学到了一个新的技能,用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;
}