HEU Tunnels(常规最小生成树)

来源:互联网 发布:海口seo 编辑:程序博客网 时间:2024/04/30 23:34

注意数据类型,使用double!

#include <cstdio>#include <cmath>#include <cstring>const int N = 110;struct Node {    double x, y;}point[N];int n;double g[N][N];const double INF = 10000000000.0;const double eps = 1e-9;double prim() {    double ans = 0.0, mi;    bool vis[N];     memset( vis, 0, sizeof(vis));    vis[0] = true;    int v;    for ( int u = 0; u < n-1; ++u ) {        mi = INF;        for ( int i = 0; i < n; ++i ) if ( !vis[i] && mi - g[0][i] > eps ) mi = g[0][i], v = i;        ans += sqrt(mi);        vis[v] = true;        for ( int i = 0; i < n; ++i ) if ( !vis[i] && g[0][i] - g[v][i] > eps ) g[0][i] = g[v][i];    }    return ans;}double dis( int i, int j ) {    return (point[i].x - point[j].x)*(point[i].x - point[j].x) + (point[i].y - point[j].y)*(point[i].y - point[j].y);}int main(){    while ( scanf("%d", &n) != EOF && n ) {        for ( int i = 0; i < n; ++i )             scanf("%lf%lf", &point[i].x, &point[i].y);        for ( int i = 0; i < n; ++i )            for ( int j = i; j < n; ++j )                 if ( i == j ) g[i][j] = INF;                else g[i][j] = g[j][i] = dis( i, j );        printf("%.2lf\n", prim());    }}


原创粉丝点击