Day2:T1搜索 T2最小生成树
T1:广搜+判断矩形
注:如何判断搜的是否为矩形:
在广搜的时候,记录下边界的坐标,然后枚举一遍过去,如果搜到"."就是牛群,否则就是房间
瞥了一眼ccy的做法,据说是floodfill的思想(至今不懂是什么?...什么时候补坑吧)
在记录边界的同时+记录同一个连通块的#的个数num,判断num?=(maxx-minx)*(maxy-miny);即可
貌似ccy的做法更科学一点,学习了
//mark...在长乐集训的时候写逗了,没有判断bfs的第一个入队的点是否在边界上,以至于wa掉了几个,以此为戒
T2:最小生成树(Prim普利姆算法)
首先这一题需要看懂题意....如果某一天自己没有看懂这题的意思,请画图不谢
//骗分,记录下他爸爸就可以了。感觉这题出得bug很大....根据题意比较过去一遍,就一定能知道该节点和哪个节点的差异程度最小,自然能一下子得出谁是该节点的直系祖先
//这里详细说一下正解:用prim实现的最小生成树
之前从来没有写过prim(普利姆算法)
prim和克鲁斯卡尔的思想完全不同,prim采用的有点类似于最短路中的bell-man或是dijkstra中"蓝白点“思想,连图解也很相像,但是prim中的dist并不像求最短路中的需要叠加,也就是说dist[v]表示的是蓝点v和白点(蓝点相连的即可)相连的最小边权;(别忘了最小生成树算法的最终目的)
具体算法模板和图解可以看c++白书P458+
///算了...自己yy一下好了:
自己乱yy的...[捂脸] u=true是蓝点,false为白点 for i:1-n
int k=0;
int minx=极大值;
for j=1-n
if u[j] && minn[j]<minx //找于白点相连的,边权值最小的蓝点
k=j;minx=minn[j];
u[k]=false;//记为白点
for j=1-n
if u[j] && minn[j]>dist[k][j]
minn[j]=dist[k][j] 最小生成树的权值就为minn之和
很容易看出prim会比克鲁斯卡尔的时间复杂度高很多,为o(n2)
但是会比prim好理解,写起来也没有什么错....
不然kruskal退出的条件一旦写错....将会无限WA,一般来说是(k==n-1) break;不过也不一定,记得长乐集训就有一题不是这样的
//然后也顺便看了看bellman算法,发现自己突然想明白bellman不能判断是否存在负环的原因(会无限循环下去,同样基于蓝白点思想)...忘了自己再翻书看看呗
//这一题其实是让我们找直系祖先(可以理解为前继)
在if u[j] && minn[j]>dist[k][j] 后面补上 pre[j]=k;即可
附上完整代码:(和注释)
【这道题一开始我没看懂什么意思,但是知道是最小生成树之后我就模拟了一下,就恍然大悟了。因为①是其所有的生物的祖先,那么我们就从1开始,首先按照样例来模拟一下。可以看根目录里面的图】
找到和①的差异最小的当然是2了,这样2的直系祖先就一定是1了,再接下去。
我们找到和①的差异第二小的当然是③了。然后③的直系祖先也是1.
再来找第③小的当然是④,但是④的直系祖先却不是①,这是因为对于④来说③与其的差异更小,所以④的直系祖先应该是③。
这点在图中可以体现得很清楚。 而我们这样分析的过程与普利姆算法求最小生成树的思想其实是一样的。
【收获:大胆的猜想。】
//普利姆算法 克鲁斯卡尔略
var
w:array[0..101,0..101] of longint;//两节点之间的距离初值最好赋一下 养成好习惯 当然这题可以不用
pre:array[0..101] of longint;//每一个节点的直系祖先
dis:array[0..101] of longint;//最小生成树
bo:array[0..101] of boolean;//判断其是否已经加入最小生成树
n,i,j,min,k:longint; begin
fillchar(bo,sizeof(bo),true);
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
read(w[i,j]);
readln;
end;
fillchar(dis,sizeof(dis),$7f div 3);//赋初值
dis[1]:=0;//从第一个点开始扩展
for i:=1 to n do
begin
min:=maxlongint;k:=0;
for j:=1 to n do
if bo[j] and (dis[j]<min) then//更新最小生成树
begin
min:=dis[j];k:=j
end;
if k=0 then break;//如果没有找到那么就直接结束
bo[k]:=false;//将这个点涂蓝 详见蓝白点思想
for j:=1 to n do
if (dis[j]>w[k,j]) and (bo[j]) then//如果这个点没有加入最小生成树。。可以试验如果更新已经加入最小生成树的会//出错。。全都会变成0
begin
dis[j]:=w[k,j];
pre[j]:=k;//前继为k
end;
end;
for i:=2 to n do writeln(pre[i]);//输出答案
end.
其实看了ccy的注释同样也让我感悟到,一种算法最重要的是思想,解决一个问题最重要的也是思想
看起来这一题并不是最小生成树,因为最小生成树的本意是用来求边权值最小的总和
但是这一题的正解却是最小生成树,为什么呢?
因为prim算法的思想正是本题的思想
我们不应该把某个算法的思想死死的定义为求某个具体的问题,而是应该将它灵活的运用起来....
Day2:T1搜索 T2最小生成树的更多相关文章
- T2 Func<in T1,out T2>(T1 arg)
委托调用方法的4种方式. using System; using System.Collections.Generic; namespace ConsoleApplication1 { delegat ...
- 现在有T1、T2、T3三个线程,怎样保证T2在T1执行完后执行,T3在T2执行完后执行?使用Join
public class TestJoin { public static void main(String[] args) { Thread t1 = new Thread(new T1(), &q ...
- 【测试】在hr用户下自行创建T1和T2表写一条SQL语句,(NL连接)
SQL> select t1.* from t1,t2 where t1.object_id=t2.object_id; rows selected. Execution Plan ------ ...
- MRI中T1和T2的含义与区分[转]
A. MRI名词解释 T1加权像.T2加权像为磁共振检查中报告中常提到的术语,很多非专业人士不明白是什么意思,要想认识何为T1加权像.T2加权像,请先了解几个基本概念: 1.磁共振(maget ...
- You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group t1,customer t2
### SQL: select t1.gid,t1.gname,t1.gvalue,t1.gtype, t1.gaddress,t1.gmembers, t1.gcode,t1.gphone, t2. ...
- 查出了a表,然后对a表进行自查询,a表的别名t1,t2如同两张表,因为t1,t2查询的条件不一样,真的如同两张表,关联两张表,可以将两行或者多行数据合并成一行,不必使用wm_concat()函数。为了将t2表的数据全部查出来使用了右连接。
with a as( select nsr.zgswj_dm, count(distinct nsr.djxh) cnt, 1 z from hx_fp.fp_ly fp, hx_dj.dj_nsrx ...
- T1,T2,T3 三个线程顺序执行
T1,T2,T3 三个线程顺序执行 现在有 T1.T2.T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?(T1->T2->T3) 这个线程问题通常会 ...
- Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数
Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...
- Noip2014 提高组 Day1 T1 生活大爆炸版石头剪刀布 + Day2 T1 无线网络发射器选址
Day1 T1 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升 ...
随机推荐
- /proc/mtd 各参数的含义 -- linux内核
经/proc虚拟文件系统读取MTD分区表:cat /proc/mtd mtd .name = raspi, .size = 0x00400000 (4M) .erasesize = 0x0001000 ...
- 第6章 适配器模式(Adapter Pattern)
原文 第6章 适配器模式(Adapter Pattern) 概述 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 解决的问 ...
- jsmart 前结合案例
前绑定jsmart这是一个不错的选择.之前通过经常使用的项目中的.最近涉及的领域的后端部.jsmart有些使用相对较少,主要是因为他想引用文件,我写的模板,在一个简单的项目,直接使用js界,很复杂的前 ...
- cocos2dx 3.1.1移植安卓apk (lua交叉编译器项目 mac环境)
cocos2dx 3.1.1 lua项目安卓交叉编译 mac环境 本文基于ant,sdk,ndk,adt等软件和环境已经事前设置好 1\新建项目 在mac的终端下输入命令: cocos new t ...
- .Net常用方法汇总
//创建某个目录的文件夹 调用如下: var folder = initFolder(Export_Folder.Text, "ExportMembers"); private s ...
- CQRS(命令查询职责分离)和 EDA(事件驱动架构)
转载CQRS(命令查询职责分离)和 EDA(事件驱动架构) 上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动 ...
- ASP.NET 5:依赖注入
ASP.NET 5:依赖注入 1.背景 如果某个具体的(或类)对象被客户程序所依赖,通常把它们抽象成抽象类或接口.简单说,客户程序摆脱所依赖的具体类型,称之为面向接口编程. 那么问题来了?如何选择客户 ...
- SSAS系列——【06】多维数据(创建Cube)
原文:SSAS系列--[06]多维数据(创建Cube) 1.文件类型说明 项目定义文件 (.dwproj).项目用户设置 (.dwproj.user).数据源文件 (.ds).数据源视图文件 (.ds ...
- 多线程编程 (1) -NSThread
每个iOS应用程序都有个专门用来更新显示UI界面.处理用户触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将那 ...
- 超高性能的json序列化
超高性能的json序列化之MVC中使用Json.Net 超高性能的json序列化之MVC中使用Json.Net 先不废话,直接上代码 Asp.net MVC自带Json序列化 1 /// <su ...