• 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;
    }
  • 相关阅读:
    关于# define 的使用
    翻转课堂---案例1
    四则运算
    第一次随笔
    第一次随笔
    第一次随笔
    beta冲刺1
    BETA 版冲刺前准备
    Alpha 事后诸葛亮
    Alpha 答辩总结
  • 原文地址:https://www.cnblogs.com/rainydays/p/2117565.html
Copyright © 2020-2023  润新知