NYOJ 118 修路方案
修路方案
- 描述
-
南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路。
现在已经知道哪些城市之间可以修路,如果修路,花费是多少。
现在,军师小工已经找到了一种修路的方案,能够使各个城市都联通起来,而且花费最少。
但是,南将军说,这个修路方案所拼成的图案很不吉利,想让小工计算一下是否存在另外一种方案花费和刚才的方案一样,现在你来帮小工写一个程序算一下吧。
- 输入
-
第一行输入一个整数T(1<T<20),表示测试数据的组数
每组测试数据的第一行是两个整数V,E,(3<V<500,10<E<200000)分别表示城市的个数和城市之间路的条数。数据保证所有的城市都有路相连。
随后的E行,每行有三个数字A B L,表示A号城市与B号城市之间修路花费为L。 - 输出
- 对于每组测试数据输出Yes或No(如果存在两种以上的最小花费方案则输出Yes,如果最小花费的方案只有一种,则输出No)
- 样例输入
-
2 3 3 1 2 1 2 3 2 3 1 3 4 4 1 2 2 2 3 2 3 4 2 4 1 2
- 样例输出
-
No Yes
-
分析:用kruskal算法先求最小生成树,标记出构成最小生成树边,然后枚举这些边,每次删一条,然后求一次生成树,将其值保存起来。求完之后,把删除的边补回去。进行下一次删边,枚举过程中保存最小值,如果最小值跟原来的最小生成树的值相等的话,则说明,该最小生成不唯一,反之唯一。
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm>using namespace std;struct edge {int u,v,cost,flag;bool operator < (const edge &w)const //按费用由小到大排序{return cost < w.cost;} }a[200010]; int n,m; int p[510];void init(int n)//并查集初始化 {for(int i = 0;i <= n;i++)p[i] = i; }int Find(int x) // 并查集查找 {while(x != p[x]){x = p[x];}return x; }int isok()//用并查集判断所有的点是否连通 {int w = Find(1);for(int i = 2;i <= n;i++){if(Find(i) != w)return 0;}return 1; }int kruskal(int k) {int sum = 0;init(n);//初始化for(int i = 0;i < m;i++){if(i != k)//去掉k这条边{int x = Find(a[i].u);int y = Find(a[i].v);if(x != y){sum += a[i].cost;p[x] = y;}}}if(isok())//如果是生成树,则返回其权值return sum;elsereturn -1; }int main() {int t;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);for(int i = 0;i < m;i++){scanf("%d %d %d",&a[i].u,&a[i].v,&a[i].cost);a[i].flag = 0;}init(n);//初始化sort(a,a + m);int ans = 0;for(int i = 0;i < m;i++){//用并查集判断u,v是否属于同一连通分量,即判断是否产生圈int x = Find(a[i].u);int y = Find(a[i].v);if(x != y) //如果不在一个连通分量{ans += a[i].cost;//将权值加入结果中p[x] = y;//合并连通分量a[i].flag = 1;//将加入集合的边进行标记}}int flag = 0;for(int i = 0;i < m;i++){if(a[i].flag == 1) //去掉求得的最小生成树中的一条边,重新求取最小生成树{if(kruskal(i) == ans)//如果求得的结果跟之前的相等{flag = 1;//表示次小生成树存在break;}}}if(flag)printf("Yes\n");elseprintf("No\n");}return 0; }
NYOJ 118 修路方案相关推荐
- NYOJ 118 修路方案(次小生成树)
修路方案 时间限制: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,由于交通不太便利,南将军准备修路. ...
- 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 ...
- nyoj118 修路方案(求次小生成树)
题目118 题目信息 运行结果 本题排行 讨论区 修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市 ...
- 修路方案(次小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- NYOJ 118-修路方案
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 题目链接:点击打开链接 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不 ...
最新文章
- 这个赛车AI不再只图一时爽,学会了考虑长远策略
- MEET大会报名开启 | 李开复张亚勤等产学研大咖邀你共同见证智能未来
- java离群值,监视-衡量Java中单线程复杂算法的最佳宏基准测试工具/框架是什么?...
- 区块链BaaS云服务(27)米链科技 HSpeed链
- 图片预加载的问题-----有针对加载和缓存的兼容解决
- Python开发以太坊智能合约指南(web3.py)
- Centos7中Memcached安装使用说明
- eclipse左边的项目栏消失的处理方法
- 在Windows上安装MySQL5.7
- Java基础学习总结(51)——JAVA分层理解
- Android滑动返回上一级界面
- ARCGIS RUNTIME FOR IOS总结(六)
- java安装了怎么打开_怎么安装打开java
- 批处理删除文件文件夹相关指令
- 一文读懂社交网络分析(附应用、前沿、学习资源)
- gitee 搭建个人网站
- 奇迹服务器技能修改,奇迹技能修改教程-地狱火技能修改介绍
- 粗略的学习一下结巴分词
- 有序边表算法----计算机图形学
- 超好用的免费PDF转换器,各种互相转换,功能齐全到你不敢相信!