#include <iostream>
#include <cstring>
#define INF 0x3f3f3f3fusing namespace std;/*Prim算法需要的全局变量*/
bool visited [501];
int cost[501][501];
int pre[501];
int lowc[501];
/*Prim算法需要的全局变量*/
/*次小生成树需要的全局变量*/
bool used[501][501]; //标记边是否被用在最小生成树中
int max_edge[501][501]; //记录两个点之间最长的边的长度
/*次小生成树需要的全局变量*/int Prim(int n)
{int total = 0, index;for(int i=2; i<=n; ++i){lowc[i] = cost[1][i];if(lowc[i]<INF)pre[i] = 1;}pre[1] = 0;visited[1] = true;for(int i=2; i<=n; ++i){int min_e = INF;for(int j=2; j<=n; ++j){if(!visited[j] && lowc[j]<min_e){min_e = lowc[j];index = j;}}total += lowc[index];visited[index] = true;used[index][pre[index]] = used[pre[index]][index] = true; //标记这条边用过了for(int j=2; j<=n; ++j){if(!visited[j] && cost[index][j]<lowc[j]){lowc[j] = cost[index][j];pre[j] = index;}if(visited[j] && j!=index) //更新最长边//这里其实是动态规划,假设2-3-4-5联通,求2-5中的最长边,//其实就是等价于2-3-4中的最长边与4-5边中的较大值//即max(max_edge(2-3-4),length(4-5))max_edge[index][j] = max_edge[j][index] = max(max_edge[pre[index]][j], lowc[index]);}}return total;
}int second_st(int n, int MST)
{int total = INF;/*遍历所有边*/for(int i=1; i<=n; ++i)for(int j=i+1; j<=n; ++j){if(!used[i][j] && cost[i][j]<INF)total = min(MST-max_edge[i][j]+cost[i][j], total);}if(total == INF) //找不到次小生成树total = -1;return total;
}int main()
{int N, M, u, v, w, MST, SMT;while(cin>>N>>M){memset(visited, 0, sizeof(visited));memset(max_edge, 0, sizeof(max_edge));memset(used, 0, sizeof(used));for(int i=1; i<=N; ++i)for(int j=1; j<=N; ++j)cost[i][j] = INF;for(int i=0; i<M; ++i){cin>>u>>v>>w;cost[u][v] = w;cost[v][u] = w;}MST = Prim(N);SMT = second_st(N, MST);cout<<MST<<' '<<SMT<<endl;}return 0;
}

求次小生成树

定义:所有生成树中路径长是第二小的树
可行变换:一棵生成树换一条边仍然为生成树,称为进行了可行变换
临集:换了边的生成树 ∈\in∈ 原来生成树的临集

  1. 用定义,得到所有的生成树(spanning tree),路径总和排第二的就是次小生成树
  2. 求得最小生成树后枚举n-1条边,循环n-1次,分别去掉第i(i ∈\in∈ [1,n-1])条边后得到的最小生成树路径,用vector存储,取最小值即可
  3. 根据“次小生成树一定在最小生成树的临集中”定理
  4. 枚举要加入哪条新边(U-V),加入后会出现一条回路,因此删除的边必须是在MST上从u到v的路径上,而且是这条路径的最长边
  5. 因为次小生成树的路径和与最小生成树的路径和之差等于加入的边与删除的边之差,
  6. 即求MST外的一条边与边的端点间最长边长度之差
  7. 再遍历所有MST外的边即可

注意

  1. prim 算法模板是用 lowc[i] = 0 表示点i 被选中
  2. 在动态规划得到max_edge时注意lowc[j]此时为0
  3. 即使在动态规划中解决了lowc[j]==0的问题(用一个tmpLostc暂时存储lowc[j]即可),我也没有成功计算出正确的max_edge,很怪

[参考]
1.https://www.bilibili.com/video/BV1CC4y1a7kD?from=search&seid=17175123924411804815&spm_id_from=333.337.0.010.
2.https://blog.csdn.net/CoolCoolCarrot/article/details/100675150?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2alles_rank~default-1-100675150.pc_search_es_clickV2&utm_term=%E5%AF%BB%E6%89%BE%E8%88%AA%E6%B5%B7%E8%B7%AF%E7%BA%BF&spm=1018.2226.3001.4187

EOJ_1094_寻找航海路线相关推荐

  1. MATLAB机器人寻找轨迹路线规划源代码

    1. clear; clc; % 建立连杆系 L1=Link([0 12.4   0   pi/2  0  -pi/2 ]); L2=Link([0 0      0  -pi/2           ...

  2. 大航海时代——海上霸主带来的启示

    最近在看<大国崛起>的纪录片,不得不说这确实是CCTV出的一部质量蛮高的纪录片.能够以一种学习的心态去看待其他国家的崛起,这种态度和胸怀本身就值得肯定. 公元15世纪左右,葡萄牙和西班牙两 ...

  3. Python学习路线——Python学习的10大阶段(0基础必须收藏)

    作为世界上最流行的编程语言之一,Python在近年来得到了前所未有的关注,今年10月,Python更是成功坐上了TIOBE排行榜的榜首. 如今,Python的应用范围十分广泛,除了程序员之外,其他岗位 ...

  4. 莫里的导航图,大数据最早的实践之一

    大数据发展的核心动力来源于人类测量.记录和分析世界的渴望.信息技术变革随处可见,但是如今的信息技术变革的重点在"T"(技术)上,而不是在"I"(信息)上.现在, ...

  5. 陈长沙:学习者参考手册

    学习者参考手册 组队学习的核心是"和一群有意思的人在一起学感兴趣的知识的过程,这个过程充满了人与人之间的交流互动,是融入社交属性和学习属性的过程".作为参与组队学习活动的学习者,一 ...

  6. 组队学习:学习者参考手册

    学习者参考手册 作为希望参与组队学习活动的学习者,一定想了解有关本次活动的各种环节.我就通过这份手册来给大家介绍一下. 本手册一共分为四个部分,分别是活动角色划分,活动流程介绍.打卡环节介绍.角色职责 ...

  7. 面试环节:在浏览器输入 URL 回车之后发生了什么?(超详细版)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者 | 4Ark 来源 | https://4ark.me/po ...

  8. 输入网址按回车,到底发生了什么

    详解输入网址点击回车,后台到底发生了什么.透析 HTTP 协议与 TCP 连接之间的千丝万缕的关系.掌握为何是三次握手四次挥手?time_wait 存在的意义是什么?全面图解重点问题,再也不用担心面试 ...

  9. 这有5种来自大自然「馈赠」的AI技术及其应用,你知道多少?

    原文来源:Towards Data Science 作者:Luke James 「雷克世界」编译:KABUDA 对于技术领域中存在的AI相关技术,我们应心存感恩.人类不仅花费了数十年的时间来研究完善数 ...

最新文章

  1. OpenStack-MitakaCentos7.2双节点搭建--(六)Dashboard服务
  2. Python程序设计题解【蓝桥杯官网题库】 DAY3-基础练习
  3. sd-wan公司组网解决方案效果如何?
  4. 学密码学一定得学程序
  5. Linux中的cp命令和mv命令
  6. c++随机打乱数组_NumPy数组基本介绍
  7. when I enter ZSOCIAL role FM RH_STRUC_GET to get organization units that a given user belongs to
  8. mysql的连接名是哪个文件_mysql连接名是什么
  9. Jqgrid pager 关于“local” dataType 动态加载数据分页的研究(没好用的研究结果)...
  10. Qt5类之QLine and QLineF
  11. ppt中如何合并流程图_PPT中图片如何排版才能好看
  12. 概率论从入门到放弃?布朗学霸火到宕机的毕业作品,让统计“看得见”
  13. 【源码好又多】开源在线教育系统
  14. 菲克扩散(第一)定律【Fick's (First) Law of Binary Diffussion】
  15. php字符串完全匹配,php之字符串和正则匹配
  16. 用python绘制熊猫图案,在python中绘制熊猫系列的CDF
  17. 基于javaweb的图书管理系统(java+jsp+layui+bootstrap+servlet+mysql)
  18. 固定资产条码管理解决方案
  19. [Jupyter Notebook]导出好看的中文PDF
  20. javafx:AnchorPane设置子容器和父容器同等大小

热门文章

  1. Spring 的前世今生
  2. Elastic-Job中的SimpleJob
  3. 工厂方法模式适用场景
  4. MyDataSourceUtils使用ThreadLocal对象
  5. 常见问题_空指针异常
  6. df的缺失值处理 df.isnull()和df.dropna()
  7. 在js中如何判断一个对象是否为空
  8. WPF特效-实现弧形旋转轮播图
  9. Powercli的一些使用案例
  10. nginx $document_uri 参数使用