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一下好了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
自己乱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;即可

 

附上完整代码:(和注释)

 

其实看了ccy的注释同样也让我感悟到,一种算法最重要的是思想,解决一个问题最重要的也是思想

看起来这一题并不是最小生成树,因为最小生成树的本意是用来求边权值最小的总和

但是这一题的正解却是最小生成树,为什么呢?

因为prim算法的思想正是本题的思想

 

我们不应该把某个算法的思想死死的定义为求某个具体的问题,而是应该将它灵活的运用起来....

 

 

posted @   polebug  阅读(248)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具
· Vue3封装支持Base64导出的电子签名组件
点击右上角即可分享
微信分享提示