最小树形图入门总结

求解最小树形图最小权值一般使用算法为朱刘算法.

原理入门推荐博客:https://blog.csdn.net/qq_34731703/article/details/53965684

ps:该博客使用模板为邻接矩阵实现,便于理解,但是在做题时邻接矩阵初始化耗时太多,我们需要改成前向星的存储方式.

关于模板: 用前向星实现的朱刘算法网上有许多模板,这里放个我觉得比较优秀的模板:https://www.cnblogs.com/vongang/archive/2012/07/18/2596851.html

关于题目: 

①:模板题入门POJ - 3164  tips:对于此类模板题,建议照着博客手敲一遍.加强对算法的记忆

②:定根与不定根的思考:

在第一个模板题里面,是给定了最小树形图的根的.但是我们做题时会发现很多题没有给定我们根,此时我们需要根据不同情况来进行构造: 

情况1:图不需要自己额外建(即题目给好了N个点,M条边),只是没有给定根.如 HDU - 2121

对于此种情况,我们需要额外添加一个点,作为根,并从这个根向每个节点都连接一条边,而边的权值需要比其他所有边的权值加起来更大,表明这些点都有可能是最小树形图的根, (至于为什么权值应该是所有边权值加起来,个人是这样认为的:首先,权值不能为0,权值为0的话最小树形图就始终会是全部取与虚根相连的边构建成的最小树形图,而当权值取其他所有之和时,可以更加方便的判断是否能生成最小树形图),在得出答案后减去虚根相连边的权值即是答案.

情况2:图需要自己建,同时也没有给定根,如HDU - 4009.

对于这种情况我们需要根据题目情况建立虚根,然后让这个根与你构建的初始点进行相连.


对应这个题,其初始点就可以设为这n个点,然后权值为在这个点建井的花费,而对于它给的其他边,我们直接在对应的两个点上建边即可,然后跑一下朱刘算法,就可得出答案.

所以,在遇到这种情况的时候,我们应该根据题目要求,让虚根和你建的边产生联系.

③: 合理的建图方法:

例题:HDU - 4966  .

首先,这个题给定我们n门课程和m个辅导班,然后给定我们每门课程需要达到的等级,对于每个辅导班,它会告诉我们等级在a课程等级达到了b即可花费e让c课程的等级达到d,问每门课程达到对应等级最小的花费.................................................................................

首先,我们可以想到可以把每门课程的每个等级都看成一个点,然后我们可以知道对于同一门课程,高等级向低等级走花费为0.

因此我们可以直接用每个课程每个等级建图,然后将每门课程的高等级向低等级连一条权值为0的边.对于辅导班,我们可以直接连接对于的课程和等级...那么对于虚根呢..其实我们很容易想到.虚根应该与每门课程等级为0的点相连.权值直接设计为0即可.

建议:在做完上面这个例题后,可以做一下这个同类型的题 HYSBZ - 4349.思考一下这个题应该怎么建图...

④:一些其他题UVA - 11865 ---->二分加最小树形图

CodeForces - 240E ------->最小树形图+路径输出 (自己独立思考出这个题就应该能完全掌握最小树形图)

做完上面这些,应该就算是入门了吧..

tips:感觉最小树形图的题是很贴切图论的关键在于建模这个核心要点的.建图一定要贴切题意,最好不要建无用边,不然复杂度会加大很多.



猜你喜欢

转载自blog.csdn.net/y_marcel_h/article/details/80459821
今日推荐