• 引水工程


    Description

    南水北调工程是优化水资源配置、促进区域协调发展的基础性工程,是新中国成立以来投资额最大、涉及面最广的战略性工程,事关中华民族长远发展。 南水北调工程,旨在缓解中国华北西北地区水资源短缺的国家战略性工程。就是把中国长江流域丰盈的水资源抽调一部分送到华北和西北地区。我国南涝北旱,南水北调工程通过跨流域的水资源合理配置,促进南北方经济、社会与人口、资源、环境的协调发展。

    整个工程分东线、中线、西线三条调水线。东线工程位于东部,因地势低需抽水北送至华北地区。中线工程从汉水与其最大支流丹江交汇处的丹江口水库引水,自流供水给黄淮海平原大部分地区,20多座大中城市;西线工程在青藏高原上,由长江上游向黄河上游补水。

    现在有N个区域需要建设水资源工程,它们可以自建水库解决缺水问题,也可以从已有水源的地区建立管道引水过来。当然,这些建设都需要大量投资。

    你能不能给出一个优化水资源配置方案,在保证每个区域都能用上水的前提下,使得整个引水工程费用最低。

    Input

    第一行:     K           表示有多少组测试数据。

    接下来对每组测试数据:

    1:      N               表示有N个区域 1<=N<=300 

    行:    W1  W2  . WN  Wi表示第i区域自建水库需要的费用

    再有N行:   Pi1  Pi2   ….  Pin   Pij表示建立第i区域与j区域引水管道的费用

    1k10      1N200    1Wi  Pij100000    Pij = Pji   Pii=0 (i=1,…, N)

      所有数据都是整数。 数据之间有一个空格。

    Output

    对于每组测试数据,输出占一行,即建立整个引水工程的最小费用。

    Sample Input

    1
    5
    5 4 4 3 6
    0 2 2 2 2
    2 0 3 3 3
    2 3 0 4 5
    2 3 4 0 1
    2 3 5 1 0
    

    Sample Output

    10
     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<algorithm>
     7 using namespace std;
     8 const int N = 1005;
     9 const int inf = 0x3f3f3f3f;
    10 typedef long long LL;
    11 int  vis[N], ac[N], n;
    12 int as[N][N], dis[N], pre[N];
    13 void init()
    14 {
    15     memset(vis, 0, sizeof(vis));
    16     memset(dis, 0, sizeof(dis));
    17     memset(pre, 0, sizeof(pre));
    18     for(int i = 0; i < N; i++)
    19         for(int j = 0; j < N; j++)
    20             if(i == j) as[i][j] = 0;
    21             else as[i][j] = inf;
    22 }
    23 LL prime()
    24 {
    25     int i, j, index;
    26     LL mini, ans = 0;
    27     for(i = 1; i < n; i++)
    28     {
    29         mini = inf;
    30         for(j = 1; j <= n; j++)
    31         {
    32             if(vis[j] == 0 && dis[j] < mini)
    33             {
    34                 mini = dis[j];
    35                 index = j;
    36             }
    37         }
    38         vis[index] = 1;
    39         //ans += ac[index] + ac[pre[index]];
    40         for(j = 1; j <= n; j++)
    41         {
    42             if(vis[j] == 0 && dis[j] > as[index][j])
    43             {
    44                 dis[j] = as[index][j];
    45                 pre[j] = index;
    46             }
    47         }
    48     }
    49     for(i = 1; i <= n; i++)
    50         ans += dis[i];
    51     return ans;
    52 }
    53 int main()
    54 {
    55     int i, j, t;
    56     LL ans;
    57     scanf("%d", &t);
    58     while(t--)
    59     {
    60         init();
    61         scanf("%d", &n);
    62         for(i = 1; i <= n; i++)
    63             scanf("%d", &dis[i]);
    64   
    65         for(i = 1; i <= n; i++)
    66             for(j = 1; j <= n; j++)
    67             {
    68                 scanf("%d", &as[i][j]);
    69                 //as[i][j] += ac[i];
    70                // as[i][j] += ac[j];
    71             }
    72         ans = prime();
    73         printf("%lld
    ", ans);
    74     }
    75     return 0;
    76 }
    最小生成树
  • 相关阅读:
    高程第五章(引用类型)
    第四章(变量、作用域、内存问题)
    label语句和break continue的使用(高程第三章)
    高级程序设计第三章
    max取得数组的最大值
    使用bind()扩充作用域
    函数
    数据类型、字符编码、文件处理
    Python入门
    8.8每日作业系列之循环模块运用
  • 原文地址:https://www.cnblogs.com/PersistFaith/p/4816825.html
Copyright © 2020-2023  润新知