修路方案

时间限制:3000 ms  |  内存限制:65535 KB
难度:5
描述

南将军率领着许多部队,它们分别驻扎在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 修路方案相关推荐

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

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

  2. nyoj 118 修路方案

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

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

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

  4. nyoj 118 修路方案【次小生成树】

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

  5. NYOJ 118 路方案(第二小的跨越)

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

  6. 1882: 修路方案 NYOJ 118

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

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

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

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

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

  9. NYOJ 118-修路方案

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

最新文章

  1. 这个赛车AI不再只图一时爽,学会了考虑长远策略
  2. MEET大会报名开启 | 李开复张亚勤等产学研大咖邀你共同见证智能未来
  3. java离群值,监视-衡量Java中单线程复杂算法的最佳宏基准测试工具/框架是什么?...
  4. 区块链BaaS云服务(27)米链科技 HSpeed链
  5. 图片预加载的问题-----有针对加载和缓存的兼容解决
  6. Python开发以太坊智能合约指南(web3.py)
  7. Centos7中Memcached安装使用说明
  8. eclipse左边的项目栏消失的处理方法
  9. 在Windows上安装MySQL5.7
  10. Java基础学习总结(51)——JAVA分层理解
  11. Android滑动返回上一级界面
  12. ARCGIS RUNTIME FOR IOS总结(六)
  13. java安装了怎么打开_怎么安装打开java
  14. 批处理删除文件文件夹相关指令
  15. 一文读懂社交网络分析(附应用、前沿、学习资源)
  16. gitee 搭建个人网站
  17. 奇迹服务器技能修改,奇迹技能修改教程-地狱火技能修改介绍
  18. 粗略的学习一下结巴分词
  19. 有序边表算法----计算机图形学
  20. 超好用的免费PDF转换器,各种互相转换,功能齐全到你不敢相信!

热门文章

  1. latex如何输入三种花体字母
  2. 你的产品是否符合基本的商业逻辑?
  3. 现代数字信号处理课后作业【第七章】IIR巴特沃兹FIR数字滤波器设计
  4. Word中插入图片,嵌入式,图片显示不能全部显示出来。
  5. Unity 3D 导航系统||Unity 3D 障碍物
  6. 积分排行榜 php,有一个积分表,积分从高往下排,怎么取出其中的一个用户的排名,积分...
  7. 从人工智能算法衍生出的机器人
  8. 「分块系列」公主的朋友 解题报告
  9. 石头剪刀布小游戏(c++)
  10. 雕爷:O2O胜负手——写给一位朋友的O2O择业分析