1601: [Usaco2008 Oct]灌水
时间:2022-05-07
本文章向大家介绍1601: [Usaco2008 Oct]灌水,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1601: [Usaco2008 Oct]灌水
Time Limit: 5 Sec Memory Limit: 162 MB Submit: 1342 Solved: 881 [Submit][Status]
Description
Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记。把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库。 建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费Pij(1<=pij<=100000,pij=pji,pii=0). 计算Farmer John所需的最少代价。
Input
*第一行:一个数n
*第二行到第n+1行:第i+1行含有一个数wi
*第n+2行到第2n+1行:第n+1+i行有n个被空格分开的数,第j个数代表pij。
Output
*第一行:一个单独的数代表最小代价.
Sample Input
4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
Sample Output
9
输出详解:
Farmer John在第四块土地上建立水库,然后把其他的都连向那一个,这样就要花费3+2+2+2=9
HINT
Source
题解:一个萌萌的最小生成树——唯一的关键就是应该再额外建立一个节点,然后连接各个可以建水库的点,然后别的点该怎么连怎么连,然后直接上MST,Accept不解释
1 var
2 i,j,k,l,m,n:longint;
3 a:array[0..1000,0..1000] of longint;
4 b:array[0..1000] of longint;
5 c:array[0..100000,1..3] of longint;
6 procedure swap(var x,y:longint);
7 var z:longint;
8 begin
9 z:=x;x:=y;y:=z;
10 end;
11
12 procedure sort(l,r:longint);
13 var
14 i,j,x,y:longint;
15 begin
16 i:=l;
17 j:=r;
18 x:=c[(i+j) div 2,3];
19 repeat
20 while c[i,3]<x do inc(i);
21 while c[j,3]>x do dec(j);
22 if i<=j then
23 begin
24 swap(c[i,1],c[j,1]);
25 swap(c[i,2],c[j,2]);
26 swap(c[i,3],c[j,3]);
27 inc(i);dec(j);
28 end;
29 until i>j;
30 if i<r then sort(i,r);
31 if l<j then sort(l,j);
32 end;
33 function getfat(x:longint):longint;
34 begin
35 while b[x]<>x do x:=b[x];
36 exit(x);
37 end;
38 procedure merge(x,y:longint);
39 begin
40 b[getfat(x)]:=getfat(y);
41 end;
42 function tog(x,y:longint):boolean;
43 begin
44 exit(getfat(x)=getfat(y));
45 end;
46
47
48
49 begin
50 readln(n);
51 for i:=1 to n do
52 begin
53 readln(a[0,i]);
54 a[i,0]:=a[0,i];
55 end;
56 for i:=1 to n do
57 begin
58 for j:=1 to n do
59 read(a[i,j]);
60 readln;
61 end;
62 m:=0;
63 for i:=0 to n do
64 b[i]:=i;
65 for i:=0 to n do
66 for j:=0 to n do
67 begin
68 if a[i,j]>0 then
69 begin
70 inc(m);
71 c[m,1]:=i;
72 c[m,2]:=j;
73 c[m,3]:=a[i,j];
74 end;
75 end;
76 sort(1,m);
77 j:=1;
78 l:=0;
79 for i:=1 to n do
80 begin
81 while tog(c[j,1],c[j,2]) do
82 inc(j);
83 merge(c[j,1],c[j,2]);
84 l:=l+c[j,3];
85 inc(j);
86
87 end;
88 writeln(l);
89 end.
- Linux基础(day53)
- 15.4 xshell使用xftp传输文件
- JDK容器学习之ArrayList:底层存储和动态扩容
- Linux基础(day57)
- 15.2/15.3 使用vsftpd搭建ftp
- JDK容器学习之Map: HashMap,TreeMap,LinkedHashMap对比小结
- 14.4 exportfs命令
- 不用那么多,每天一点点,学习React,贵在持之以恒
- Linux基础(day56)
- android classloader双亲委托模式
- 14.3 NFS配置选项
- 14.2 NFS服务端安装配置
- React Native组件之Button
- JDK容器学习之TreeMap (二) : 使用说明
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 高效的5个pandas函数,你都用过吗?
- jz2440重新分区
- 腾讯云TCB云函数趣应用:巧用 puppeteer 五分钟实现一个云加社区个人成就爬虫
- NFS挂载的2种方式
- Angular Component 开发时属性和运行时属性的对照
- 第002课 ubuntu环境搭建和ubuntu图形界面操作(免费)
- 爆破cobalt strike密码脚本
- 第003课 linux入门命令详解
- 第004课 vi编辑器的使用详解
- 【前端JQ】jQuery赋值checked的几种写法,attr()方法不好使,建议使用prop()方法。
- 达梦数据库适配问题
- Angular Component UI单元测试的隔离策略
- 第005课 linux进阶命令(文件查找,文件解压操作详解)
- 没有这 29 款插件的 Chrome 是没有灵魂的
- 第006课 开发板熟悉与体验