zoukankan      html  css  js  c++  java
  • 蓝桥练习-怎么就不对呢

    算法提高 最小方差生成树  

    时间限制:1.0s   内存限制:256.0MB
          
    问题描述
    给定带权无向图,求出一颗方差最小的生成树。
    输入格式
    输入多组测试数据。第一行为N,M,依次是点数和边数。接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W。保证图连通。n=m=0标志着测试文件的结束。
    输出格式
    对于每组数据,输出最小方差,四舍五入到0.01。输出格式按照样例。
    样例输入
    4 5
    1 2 1
    2 3 2
    3 4 2
    4 1 1
    2 4 3
    4 6
    1 2 1
    2 3 2
    3 4 3
    4 1 1
    2 4 3
    1 3 3
    0 0
    样例输出
    Case 1: 0.22
    Case 2: 0.00
    数据规模与约定

    1<=U,V<=N<=50,N-1<=M<=1000,0<=W<=50。数据不超过5组。

    #define _CRT_SECURE_NO_DEPRECATE
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define MAX 120
    #define INF 1000000.0
    using namespace std;
    double cost[MAX][MAX];
    int N, M;
    double d[MAX];
    bool visit[MAX];
    double meanvalue, meanvarience;//顶点数、边数、最小平均值、最小方差值
    void dfs(int x, int num){
        if (num == N){
            double value = 0, varience = 0;//平均值和方差
            for (int i = 1; i < N; i++){
                value += d[i];
            }
            value /= (N - 1);
            for (int i = 1; i < N; i++){
                varience += (d[i] - value)*(d[i] - value);
            }
            varience /= (N - 1);
            if (varience < meanvarience){
                meanvarience = varience;
            }
            return;
        }
        for (int i = 1; i <= N; i++){
            if (!visit[i] && cost[x][i] < INF){
                visit[i] = true; d[num] = cost[x][i];
                dfs(i, num + 1);
                visit[i] = false;
            }
        }
    }
    int main()
    {
        int u, v, t=0;
        double w;
        while (true){
            scanf("%d %d", &N, &M);
            if (N + M == 0)break;
            for (int i = 1; i <= N; i++){
                visit[i] = false;
                for (int j = 1; j <= N; j++){
                    cost[i][j] = INF;
                }
            }
            meanvalue = INF;
            meanvarience = INF;
            for (int i = 0; i < M; i++){
                scanf("%d %d %lf", &u, &v, &w);
                if (cost[u][v]>w){
                    cost[u][v] = cost[v][u] = w;
                }
            }
            visit[1] = true;
            dfs(1, 1);
            printf("Case %d: %.2lf
    ", ++t, meanvarience);
        }
        return 0;
    }
    世上无难事,只要肯登攀。
  • 相关阅读:
    寒假的Java学习笔记总结1
    寒假的Java学习笔记总结0
    归档七
    数组归档
    课后作业感悟2
    作业感悟1
    《大道至简》第二章(是懒人创造了方法)读后感
    postman接口测试-文件上传
    postman接口测试:获取所有信息
    怎么测接口?
  • 原文地址:https://www.cnblogs.com/littlehoom/p/3556247.html
Copyright © 2011-2022 走看看