博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第八届河南省赛D.引水工程(kruthcra+prime)
阅读量:5134 次
发布时间:2019-06-13

本文共 2475 字,大约阅读时间需要 8 分钟。

D.引水工程

Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 118  Solved: 41 [ ][ ][ ]

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

HINT

 

Source

题解:克鲁斯卡尔ac,然而我的prime wawawa;克鲁斯卡尔想法,把0代表引水花费,然后最小生成树就可以了,prime想复杂了,想着比较连接城市的花费与直接引水花费比较的;但是wa;

改成克鲁斯卡尔想法,prime也过了;

克鲁斯卡尔:

#include
#include
#include
#include
#include
#include
using namespace std;#define mem(x,y) memset(x,y,sizeof(x))#define SI(x) scanf("%d",&x)#define SL(x) scanf("%lld",&x)#define PI(x) printf("%d",x)#define PL(x) printf("%lld",x)#define P_ printf(" ")const int INF=0x3f3f3f3f;const double PI=acos(-1.0);typedef long long LL;const int MAXN=350;struct Node{ int u,v,w; Node init(int x=0,int y=0,int z=0)/*:u(x),v(y),w(z)*/{ u=x;v=y;w=z; } friend bool operator < (Node a,Node b){ return a.w

  prime  ac:

#include
#include
#include
#include
#include
#include
using namespace std;#define mem(x,y) memset(x,y,sizeof(x))#define SI(x) scanf("%d",&x)#define SL(x) scanf("%lld",&x)#define PI(x) printf("%d",x)#define PL(x) printf("%lld",x)#define P_ printf(" ")const int INF=0x3f3f3f3f;const double PI=acos(-1.0);typedef long long LL;const int MAXN=350;int w[MAXN];int p[MAXN][MAXN];int N;int dis[MAXN];int vis[MAXN];int usd[MAXN];void prim(){ mem(vis,0); // mem(usd,0); for(int i=0;i<=N;i++)dis[i]=p[0][i]; vis[0]=1; int ans=0,flot=0; while(true){ int temp=INF,k; for(int i=0;i<=N;i++) if(!vis[i]&&temp>dis[i])temp=dis[k=i]; if(temp==INF)break; //printf("%d %d %d\n",k,w[k],temp); // if(temp

  

 

转载于:https://www.cnblogs.com/handsomecui/p/5094446.html

你可能感兴趣的文章
Javascript 立即执行函数
查看>>
Python Extension Programming with C
查看>>
使用Word2010直接编辑、发布博客→博客园cnblogs
查看>>
蓝桥杯:十六进制转八进制
查看>>
iOS学习-字符串的删除替换
查看>>
可能比文档还详细--VueRouter完全指北
查看>>
Android状态栏颜色修改
查看>>
Android Canvas drawText实现中文垂直居中
查看>>
Android蓝牙A2dp profile的使用
查看>>
有效值——百度百科
查看>>
DP习题
查看>>
FullCalendar 的学习笔记(一)
查看>>
运维思想--01
查看>>
并查集
查看>>
设计模式之-单例模式
查看>>
js获取url后面的参数值
查看>>
第四章 心得体会
查看>>
7-1 打印沙漏
查看>>
IAR Embedded Workbench IDE 显示行号
查看>>
android 选择多选图片
查看>>