• poj3625


    最小生成树

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    #include
    <cmath>
    using namespace std;

    #define maxn 1005
    #define inf 0x3f3f3f3f

    struct Point
    {
    long long x, y;
    } point[maxn];

    int n, m;
    long double cost[maxn][maxn];
    int vis[maxn];
    long double lowc[maxn];

    double dist(Point &a, Point &b)
    {
    Point p;
    p.x
    = a.x - b.x;
    p.y
    = a.y - b.y;
    return sqrt(p.x * p.x + p.y * p.y);
    }

    double prim()
    {
    int i, j, p;
    long double minc, res = 0;
    memset(vis,
    0, sizeof(vis));
    vis[
    0] = 1;
    for (i = 1; i < n; i++)
    lowc[i]
    = cost[0][i];
    for (i = 1; i < n; i++)
    {
    minc
    = inf;
    p
    = -1;
    for (j = 0; j < n; j++)
    if (0 == vis[j] && minc > lowc[j])
    {
    minc
    = lowc[j];
    p
    = j;
    }
    if (inf == minc)
    return -1;
    res
    += minc;
    vis[p]
    = 1;
    for (j = 0; j < n; j++)
    if (0 == vis[j] && lowc[j] > cost[p][j])
    lowc[j]
    = cost[p][j];
    }
    return res;
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
    scanf(
    "%lld%lld", &point[i].x, &point[i].y);
    for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
    cost[i][j]
    = cost[j][i] = dist(point[i], point[j]);
    for (int i = 0; i < m; i++)
    {
    int a, b;
    scanf(
    "%d%d", &a, &b);
    a
    --;
    b
    --;
    cost[a][b]
    = cost[b][a] = 0;
    }
    printf(
    "%.2f\n", prim());
    return 0;
    }
  • 相关阅读:
    java:字符串(下)
    java字符串(上)
    Java流程控制:循环语句
    JAVA学习笔记(二十三)
    JAVA学习笔记(二十二)
    JAVA学习笔记(二十一)
    JAVA学习笔记(二十)
    JAVA学习笔记(十九)
    JAVA学习笔记(十八)
    JAVA学习笔记(十七)
  • 原文地址:https://www.cnblogs.com/rainydays/p/2117565.html
Copyright © 2020-2023  润新知