煞笔题

来源:互联网 发布:淘宝网店销赃案例 编辑:程序博客网 时间:2024/06/01 14:49

第八届河南省acm

10409: D.引水工程

Time Limit: 2 Sec  Memory Limit: 128 MB
Submit: 22  Solved: 12
[Submit][Status][Web Board]

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

155 4 4 3 60 2 2 2 22 0 3 3 32 3 0 4 52 3 4 0 12 3 5 1 0

Sample Output

10
#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <vector>#include <string>#include <queue>#include <cmath>#define LL __int64using namespace std;int main(){    int i,j,k;    int t,n,m;    int x,y,z;    int used[440];    int mp[440][440];    int a[440];    scanf("%d",&t);    while(t--)    {        memset(used,0,sizeof(used));        int sum=0;        scanf("%d",&n);        int Min=1e9;        int temp;        for(i=0; i<n; i++)        {            scanf("%d",&a[i]);            if(a[i]<Min)                Min=a[i],temp=i;        }        for(i=0; i<n; i++)            for(j=0; j<n; j++)                scanf("%d",&mp[i][j]);        int flag=0;        sum+=Min;        used[temp]=1;//肯定需要建水库,那就建造花费最少的。        for(i=1; i<n; i++)        {            Min=1e9;            for(k=0; k<n; k++)            {                if(used[k]==0)//从已建好的水库或已供应水的地区开始 再向其他地区建水库或联通(花费最少的)。                    continue;                for(j=0; j<n; j++)                {                    if(used[j])                        continue;                    if(k==j)                        continue;                    if(Min>a[j])                        Min=a[j],temp=j;                    if(Min>mp[k][j])                        Min=mp[k][j],temp=j;//找出来下一个要供水的地区(联通或建水库)                }            }            used[temp]=1;            sum+=Min;        }        printf("%d\n",sum);    }        return 0;}


0 0