nyoj118 修路方案(求次小生成树)
- 题目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
- 来源
- 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 修路方案(求次小生成树)相关推荐
- 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,由于交通不太便利,南将军准备修路. ...
- NYOJ118 修路方案
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=118 题目分析: 上次也做了那个最小生成树的题了,但是当时只是看懂了那两个算法,没有深入理 ...
- NYOJ118 修路方案 次小生成树
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- 南阳118--修路方案(次小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- acwing1148——秘密的牛奶运输(求次小生成树)
https://www.acwing.com/problem/content/description/1150/ 农夫约翰要把他的牛奶运输到各个销售点. 运输过程中,可以先把牛奶运输到一些销售点,再由 ...
- NYOJ 118 修路方案(次小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
最新文章
- Spark Streaming使用Kafka保证数据零丢失
- Git和Github的区别与操作简介
- matlab如何创建table,MATLAB table数据结构 首篇
- POJ 3349 Snowflake Snow Snowflakes
- Android 高仿微信6.0主界面 带你玩转切换图标变色
- 项目开发管理工具---GitHub(一)
- GameDev.net日报 2010.11.12 要卖了
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
- HDU 5046 Airport ( Dancing Links 反复覆盖 )
- CryptoJS加密使用
- QTcpServer和QTcpSocket使用详解
- 3dsMax一渲染就卡住、3DMAX渲染完卡死怎么办?解决方法来了
- 【FFmpeg系列】使用FFmpeg实现视频图像旋转、翻转或转置
- PHP手册 2009国庆版
- 练习打字速度效果很好的网站(本人亲测)
- 汇编程序设计-11-AX、BX、CX、DX寄存器
- C语言程序设计-商品销售管理系统
- jsp页面如何调用本机的应用程序?例如c:/netterm.exe?
- 【转】搜狗开源内部项目管理平台Cynthia意欲何为
- 稳健经营,龙光集团成为“中国地产上市公司财务稳健奖”获得者之一