NYOJ118 修路方案
题目链接: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 修路方案相关推荐
- NYOJ118 修路方案 次小生成树
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- nyoj118 修路方案(求次小生成树)
题目118 题目信息 运行结果 本题排行 讨论区 修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市 ...
- NYOJ-118 修路方案
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- NYOJ 118 修路方案(次小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- 修路方案(次小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- nyoj 118 修路方案
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- NYOJ 118 修路方案
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- 1882: 修路方案 NYOJ 118
1882: 修路方案 时间限制: 3 Sec 内存限制: 64 MB 提交: 43 解决: 18 您该题的状态:已完成 [提交][状态][讨论版] 题目描述 南将军率领着许多部队,它们分别驻扎在N ...
- nyoj 118 修路方案(次小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
最新文章
- DB2数据库常用语句
- python中常见的流程结构-【Python2】04、Python程序控制结构
- C++函数指针和函数重载
- python怎么计算时间_python怎么计算若干分钟后是第几天,星期几
- 轻量级锁的加锁和解锁逻辑
- python爬取的内容不是中午_大年初六中午,全国各区县哪里最冷?
- 修复win10的更新服务器,大师搞定win10系统自动更新失败的修复步骤
- 数据库流行度5月排行榜:Oracle企稳PostgreSQL飙升
- boost::asio的C/S结构笔记
- RX库中的IDisposable对象
- 字符串转数组和数组转字符串
- 通用的流氓软件手动清理方法
- 20190801H3C无线控制器3510H 版本升级总结
- winhex基础教程(更新中)
- 华为SmartKit工具下载
- 自定义wordpress登陆界面全屏渐变图片轮播
- 如何在Mac上清理磁盘空间?
- w7查看计算机每天开关机时间,WINDOWS7 怎么查看上次开关机时间
- 8.2 使用Alpha混合技术
- centos7更换yum仓库、静态IP、SSH密钥登陆