BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )

计算距离时平方爆了int结果就WA了一次......

-----------------------------------------------------------------------------------------

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<iostream>

#include<vector>

#include<cmath>

#define rep( i , n ) for( int i = 0 ; i < n ; i++ )

#define clr( x , c ) memset( x , c , sizeof( x ) )

using namespace std;

const int maxn = 1000 + 5;

int n;

struct P {

int x , y;

void Read() {

scanf( "%d%d" , &x , &y );

}

};

P A[ maxn ];

double dist( P a , P b ) {

return sqrt( 1LL * ( a.x - b.x ) * ( a.x - b.x ) + 1LL * ( a.y - b.y ) * ( a.y - b.y ) );

}

int p[ maxn ];

void UF_init() {

rep( i , n )

p[ i ] = i;

}

int find( int x ) {

return x == p[ x ] ? x : p[ x ] = find( p[ x ] );

}

bool unite( int x , int y ) {

x = find( x ) , y = find( y );

p[ x ] = y;

return x != y;

}

struct edge {

int u , v;

double d;

bool operator < ( const edge &e ) const {

return d < e.d;

}

};

vector< edge > E;

void E_clear() {

E.clear();

}

double MST() {

double res = 0;

sort( E.begin() , E.end() );

rep( i , E.size() ) {

edge &e = E[ i ];

if( unite( e.u , e.v ) )

res += e.d;

}

return res;

}

int main() {

freopen( "test.in" , "r" , stdin );

int m;

cin >> n >> m;

UF_init();

E_clear();

rep( i , n )

A[ i ].Read();

while( m-- ) {

int u , v;

scanf( "%d%d" , &u , &v );

u-- , v--;

unite( u , v );

}

rep( i , n )

for( int j = i + 1 ; j < n ; ++j ) if( find( i ) != find( j ) )

E.push_back( ( edge ) { i , j , dist( A[ i ] , A[ j ] ) } );

printf( "%.2lf\n" , MST() );

return 0;

}

-----------------------------------------------------------------------------------------

1626: [Usaco2007 Dec]Building Roads 修建道路

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 1212  Solved: 470
[Submit][Status][Discuss]

Description

Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场)。有些农场之间原本就有道路相连。 所有N(1 <= N <= 1,000)个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i, Y_i)的点(0 <= X_i <= 1,000,000;0 <= Y_i <= 1,000,000),两个农场间道路的长度自然就是代表它们的点之间的距离。现在Farmer John也告诉了你农场间原有的M(1 <= M <= 1,000)条路分别连接了哪两个农场,他希望你计算一下,为了使得所有农场连通,他所需建造道路的最小总长是多少。

Input

* 第1行: 2个用空格隔开的整数:N 和 M

* 第2..N+1行: 第i+1行为2个用空格隔开的整数:X_i、Y_i * 第N+2..N+M+2行: 每行用2个以空格隔开的整数i、j描述了一条已有的道路, 这条道路连接了农场i和农场j

Output

* 第1行: 输出使所有农场连通所需建设道路的最小总长,保留2位小数,不必做 任何额外的取整操作。为了避免精度误差,计算农场间距离及答案时 请使用64位实型变量

Sample Input

4 1
1 1
3 1
2 3
4 3
1 4

输入说明:

FJ一共有4个坐标分别为(1,1),(3,1),(2,3),(4,3)的农场。农场1和农场
4之间原本就有道路相连。

Sample Output

4.00

输出说明:

FJ选择在农场1和农场2间建一条长度为2.00的道路,在农场3和农场4间建一
条长度为2.00的道路。这样,所建道路的总长为4.00,并且这是所有方案中道路
总长最小的一种。

HINT

Source

Silver

时间: 2024-10-31 07:47:00

BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )的相关文章

bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场之间原本就有道路相连. 所有N(1 <= N <= 1,000)个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i,

[BZOJ] 1626: [Usaco2007 Dec]Building Roads 修建道路

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1724  Solved: 725[Submit][Status][Discuss] Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场之间原本就有道路相连. 所

bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路【最小生成树】

先把已有的边并查集了,然后MST即可 记得开double #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int N=1005; int n,m,f[N],con,tot; double x[N],y[N],ans; struct qwe { int u,v; double w; }e[N*N]; bool c

[BZOJ1626][Usaco2007 Dec]Building Roads 修建道路

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1730  Solved: 727 [Submit][Status][Discuss] Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场之间原本就有道路相连.

[Usaco2007 Dec]Building Roads 修建道路[最小生成树]

Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场之间原本就有道路相连. 所有N(1 <= N <= 1,000)个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i, Y_i)的点(0 <= X_i <= 1,000,000:0 <= Y_i <= 1,000,000),两个农场间道路的长度自然就是代

BZOJ 1626: [Usaco2007 Dec]Building Roads

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1626 赤裸裸的最次生成树,已有的边赋为0就好了,我用了prim(因为不熟) 不过有个神坑点,算坐标中乘法会超出int范围,所以在里面也要转为double(当然不排除你一开始用的就是long long) 程序: #include<iostream> #include<cstdio> #include<cmath> #define INF 2100000000.0

POJ 2421 Constructing Roads 修建道路 最小生成树 Kruskal算法

题目链接:POJ 2421 Constructing Roads 修建道路 Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19698   Accepted: 8221 Description There are N villages, which are numbered from 1 to N, and you should build some roads such that e

BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )

数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #

BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][Status][Discuss] Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所