• 题目118
  • 题目信息
  • 运行结果
  • 本题排行
  • 讨论区

修路方案

时间限制: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
来源
POJ题目改编
上传者
张云聪

对于最小生成树(可以用kruskal和prime算法求得,在这里我是用kruskal求得,如果不会请自己百度。),边的权值的和最小称为最小生成树。

而次小生成树就是除了最小生成树外的最小生成树。而且所有的次小生成树都是通过最小生成树的换边得到的。

所以难点就是如何换边。

对于如何换边:

1.先求出最小生成树,值为x。

2.一一枚举添加不在生成树上的边(这时候一定形成了一个环)

3.寻找环上的(最小生成树上的边)权值最大值与你所添加不在生成树上的边的权值比较

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
#define N 200000+10
struct node
{int a,b,l;
}city[N];
int fa[505];
bool use[N];
node n1;
vector<node>link[505];
bool cmp(node x,node y)
{return x.l<y.l;
}
int find(int x)
{if(fa[x]!=x) fa[x]=find(fa[x]);return fa[x];
}
int maxx;
bool findedge(int root,int a,int b)
{if(a==b) return true;for(int i=0;i<link[a].size();i++){n1=link[a][i];if(n1.a!=root){//   printf("l=%d ",n1.l);int temp=maxx;if(maxx<n1.l) maxx=n1.l;if(findedge(a,n1.a,b))return true;maxx=temp;}}return false;
}
void init(int v)
{for(int i=1;i<=v;i++)fa[i]=i;
}
int main()
{int t;scanf("%d",&t);while(t--){memset(use,false,sizeof(use));memset(city,0,sizeof(city));memset(link,0,sizeof(link));int v,e;scanf("%d %d",&v,&e);init(v);for(int i=0;i<e;i++){scanf("%d %d %d",&city[i].a,&city[i].b,&city[i].l);}sort(city,city+e,cmp);int cnt=0;for(int i=0;i<e;i++){int aa=find(city[i].a);int bb=find(city[i].b);if(aa!=bb){use[i]=true;fa[aa]=bb;n1.a=city[i].a,n1.l=city[i].l;link[city[i].b].push_back(n1);n1.a=city[i].b;link[city[i].a].push_back(n1);if(++cnt==v-1)break;}}bool has=false;for(int i=0;i<e;i++){if(use[i]) continue;maxx=-1;findedge(city[i].a,city[i].a,city[i].b);if(maxx==city[i].l){has=true;break;}}if(has)puts("Yes");elseputs("No"); }
}

nyoj118 修路方案(求次小生成树)相关推荐

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

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

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

    修路方案 时间限制: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. NYOJ118 修路方案

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=118 题目分析: 上次也做了那个最小生成树的题了,但是当时只是看懂了那两个算法,没有深入理 ...

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

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

  7. 南阳118--修路方案(次小生成树)

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

  8. acwing1148——秘密的牛奶运输(求次小生成树)

    https://www.acwing.com/problem/content/description/1150/ 农夫约翰要把他的牛奶运输到各个销售点. 运输过程中,可以先把牛奶运输到一些销售点,再由 ...

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

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

最新文章

  1. Spark Streaming使用Kafka保证数据零丢失
  2. Git和Github的区别与操作简介
  3. matlab如何创建table,MATLAB table数据结构 首篇
  4. POJ 3349 Snowflake Snow Snowflakes
  5. Android 高仿微信6.0主界面 带你玩转切换图标变色
  6. 项目开发管理工具---GitHub(一)
  7. GameDev.net日报 2010.11.12 要卖了
  8. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
  9. HDU 5046 Airport ( Dancing Links 反复覆盖 )
  10. CryptoJS加密使用
  11. QTcpServer和QTcpSocket使用详解
  12. 3dsMax一渲染就卡住、3DMAX渲染完卡死怎么办?解决方法来了
  13. 【FFmpeg系列】使用FFmpeg实现视频图像旋转、翻转或转置
  14. PHP手册 2009国庆版
  15. 练习打字速度效果很好的网站(本人亲测)
  16. 汇编程序设计-11-AX、BX、CX、DX寄存器
  17. C语言程序设计-商品销售管理系统
  18. jsp页面如何调用本机的应用程序?例如c:/netterm.exe?
  19. 【转】搜狗开源内部项目管理平台Cynthia意欲何为
  20. 稳健经营,龙光集团成为“中国地产上市公司财务稳健奖”获得者之一

热门文章

  1. 卡罗拉汽车发动机下护板
  2. Iconfont怎么保留图标颜色
  3. 如何制定专属于自己的个人目标
  4. 素数判断 isPrime(java实现)
  5. 《计算机考研-机试指南》- 3数学问题
  6. SaaS launch Kit成回收宝和友盟云合作纽带,帮助提升3倍上云效率
  7. Python暴力破解教程: Zip、pdf加密在线爆破!
  8. 种子计量系统市场现状及未来发展趋势
  9. java实现当前时间往前推N小时
  10. 牛逼,用Python为她设计专属签名软件