题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=118

题目分析:
上次也做了那个最小生成树的题了,但是当时只是看懂了那两个算法,没有深入理解,然后这道题试图用上次的套路做,结果悲剧的TLE了,我贡献了N个WA啊,只能说明我太执着了。唉~不说了说多了都是泪。我纠结了一整天,一整天啊~~~
这道题其实上就是求次小生成树,判断次小生成树是不是和最小生成树一样大。加入一条不属于最小生成树的最小的边e,必然会有一个环,找出这个环中非e的长度最长的边,用e替换之即可。这里用一个二维数组就可以维护节点i到节点j的最长的边。当一个节点作为新节点v加入集合s的时候,s中已有的点与v的最长的边就是max(到其前驱节点的最长的边,前驱节点到v的边长)。
下面说说prim算法,其本质是把图分成两个集合,记以选入的最小生成树的集合为s,则与之对应的,其补集记为u,每一次迭代,其实就是选u中与集合s距离最近的点,加到s中,有了这个思想看代码也就不难了,我的代码都写上了注释,应该不难看懂。

#include<stdio.h>
#include<string.h>const int N = 501;
int Map[N][N];//两点之间的距离
bool used[N];//节点是否用过
int dis[N];//集合外的点到集合s的最短距离
int pre[N];//集合外的点距离最近的集合s中的点
int MaxLen[N][N];//两个节点间的最大的边的长度inline int max(const int a, const int b)
{return a > b ? a : b;
}void Prim(int n)
{int i,j;int Min,MinI,pr;used[1] = true;//初始状态,只有1在集合内,其他点到集合的距离即为到1的距离for(i = 2; i <= n; ++i){dis[i] = Map[1][i];pre[i] = 1;}for(i = 1; i < n; ++i){Min = 1e7;//找出与集合s距离最近的点for(j = 2; j <= n; ++j){if(!used[j] && Min > dis[j]){MinI = j;Min = dis[j];}}pr = pre[MinI];MaxLen[pr][MinI] = MaxLen[MinI][pr] = dis[MinI];//更新集合s到新加入的点的最长边for(j = 1; j <= n; ++j){if(used[j])MaxLen[j][MinI] = MaxLen[MinI][j] = max(MaxLen[j][pr], dis[MinI]);}used[MinI] = true;//更新集合s到s外各点的距离for(j = 2; j <= n; ++j){if(!used[j] && Map[j][MinI] < dis[j]){dis[j] = Map[j][MinI];pre[j] = MinI;}}       }
}bool SecondMST(int n)
{int i,j;for(i = 1; i <= n; ++i){for(j = i + 1; j <= n; ++j){//说明节点i到j的边已经用过了if(pre[i] == j || pre[j] == i)continue;else if(MaxLen[i][j] == Map[i][j])return true;}}return false;
}int main()
{int t,v,e;int a,b,c;int i,j;scanf("%d", &t);while(t--){scanf("%d %d", &v, &e);for(i = 1; i <= v; ++i)for(j = 1; j <= v; ++j)Map[i][j] = 1e7;memset(used, 0, sizeof(used));for(i = 0; i < e; ++i){scanf("%d %d %d", &a, &b, &c);Map[a][b] = Map[b][a] = c;}Prim(v);if(SecondMST(v))printf("Yes\n");elseprintf("No\n");}return 0;
}

NYOJ118 修路方案相关推荐

  1. NYOJ118 修路方案 次小生成树

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...

  2. nyoj118 修路方案(求次小生成树)

    题目118 题目信息 运行结果 本题排行 讨论区 修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市 ...

  3. NYOJ-118 修路方案

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...

  4. NYOJ 118 修路方案(次小生成树)

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...

  5. 修路方案(次小生成树)

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...

  6. nyoj 118 修路方案

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...

  7. NYOJ 118 修路方案

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...

  8. 1882: 修路方案 NYOJ 118

    1882: 修路方案 时间限制: 3 Sec  内存限制: 64 MB 提交: 43  解决: 18 您该题的状态:已完成 [提交][状态][讨论版] 题目描述 南将军率领着许多部队,它们分别驻扎在N ...

  9. nyoj 118 修路方案(次小生成树)

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...

最新文章

  1. DB2数据库常用语句
  2. python中常见的流程结构-【Python2】04、Python程序控制结构
  3. C++函数指针和函数重载
  4. python怎么计算时间_python怎么计算若干分钟后是第几天,星期几
  5. 轻量级锁的加锁和解锁逻辑
  6. python爬取的内容不是中午_大年初六中午,全国各区县哪里最冷?
  7. 修复win10的更新服务器,大师搞定win10系统自动更新失败的修复步骤
  8. 数据库流行度5月排行榜:Oracle企稳PostgreSQL飙升
  9. boost::asio的C/S结构笔记
  10. RX库中的IDisposable对象
  11. 字符串转数组和数组转字符串
  12. 通用的流氓软件手动清理方法
  13. 20190801H3C无线控制器3510H 版本升级总结
  14. winhex基础教程(更新中)
  15. 华为SmartKit工具下载
  16. 自定义wordpress登陆界面全屏渐变图片轮播
  17. 如何在Mac上清理磁盘空间?
  18. w7查看计算机每天开关机时间,WINDOWS7 怎么查看上次开关机时间
  19. 8.2 使用Alpha混合技术
  20. centos7更换yum仓库、静态IP、SSH密钥登陆

热门文章

  1. 只有一端开口的瓶子(C++)
  2. rtk 精确定位 简介
  3. 计算机画图怎么画荷花图片简笔画,画荷花最简单的画法 荷花画图片简单画法...
  4. 五柳先生传(陶渊明)
  5. 【云计算】私有云在VMware下虚拟机的创建与配置(图文教程)
  6. java调用阿里云api发送短信验证服务
  7. 世界上最震撼的屏幕保护程序
  8. 软件测试周刊(第71期):大悲时不发言,大怒时不争辩,大喜时不许诺。
  9. python:超级画板
  10. 商品筛选html,js实现简单商品筛选功能