Nyoj 修路方案(次小生成树)
- 描述
-
南将军率领着许多部队,它们分别驻扎在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
- 2
- 样例输出
-
- No
- Yes
- No
- 来源
- POJ题目改编
- 上传者
- 张云聪
题意:次小生成树
WA代码:
- #include <vector>
- #include <map>
- #include <set>
- #include <algorithm>
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #include <cstdlib>
- #include <string>
- #include <cstring>
- #include <queue>
- using namespace std;
- #define MAX 200020
- #define INF 0x3f3f3f3f
- struct edge
- {
- int x,y,cost;
- int flag;
- };
- edge e[MAX];
- int f[MAX];
- int dis[MAX];
- int v,n,m,ans;
- bool cmp(edge a,edge b)
- {
- return a.cost<b.cost;
- }
- void init(int n)
- {
- for(int i=;i<=n;i++)
- f[i]=i;
- }
- int find(int x)
- {
- if(x!=f[x])
- f[x]=find(f[x]);
- return f[x];
- }
- void Union(int x,int y)
- {
- x=find(x);
- y=find(y);
- f[y]=x;
- }
- int same(int x,int y)
- {
- return find(x)==find(y);
- }
- int kruskal_1(int n,int m)
- {
- int ans=;
- for(int i=;i<m;i++)
- {
- if(!same(e[i].x,e[i].y))
- {
- e[i].flag=;
- Union(e[i].x,e[i].y);
- ans+=e[i].cost;
- }
- }
- return ans;
- }
- int kruskal_2(int n,int m)
- {
- int ans=,cnt=;
- for(int i=;i<m;i++)
- {
- if (i == n)//除去这条边之后再求一次最小生成树
- continue;
- if(!same(e[i].x,e[i].y))
- {
- Union(e[i].x,e[i].y);
- ans+=e[i].cost;
- cnt++;
- }
- }
- if(cnt!=n)
- return -;
- else
- return ans;
- }
- int main()
- {
- int t;
- scanf("%d",&t);
- while(t--){
- init(n);
- memset(e,,sizeof(e));
- int v=;
- scanf("%d%d",&n,&m);
- int count;
- for(int i=; i<m; i++){
- scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].cost);
- e[i].flag=;
- }
- sort(e,e+m,cmp);
- int flag=,prim_2;
- int prim_1=;
- prim_1=kruskal_1(n,m);
- /*for(int i=0; i<m; i++){
- cout<<e[i].x<<e[i].y<<e[i].cost<<e[i].flag<<endl;
- }*/
- for(int i=; i<m; i++){
- if(e[i].flag==)
- continue;
- prim_2=;
- init(n);
- prim_2=kruskal_2(i,m);
- if(prim_2==prim_1){
- flag=;
- break;
- }
- }
- if(prim_1==prim_2){
- flag=;
- }
- if(flag)
- printf("Yes\n");
- else
- printf("No\n");
- }
- }
AC代码:
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- struct node
- {
- int u,v,val;
- int flog;
- }edge[+];
- int pre[],m,n,minn;
- void init()
- {
- for(int i=;i<;i++)
- pre[i]=i;
- }
- int cmp(node s1,node s2)
- {
- return s1.val<s2.val;
- }
- int find(int x)
- {
- return pre[x]==x?x:pre[x]=find(pre[x]);
- }
- int F(int w)
- {
- int sum=;
- for(int i=;i<m;i++)
- {
- if(i!=w)
- {
- int fx=find(edge[i].u);
- int fy=find(edge[i].v);
- if(fx!=fy)
- {
- pre[fx]=fy;
- sum+=edge[i].val;
- }
- }
- }
- int s=find();//判断全部的点是不是已经全部连进去
- for(int i=;i<=n;i++)
- if(pre[i]!=s)
- return -;
- return sum;
- }
- int main()
- {
- int t;
- scanf("%d",&t);
- while(t--)
- {
- init();
- scanf("%d%d",&n,&m);
- for(int i=;i<m;i++)
- scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].val),edge[i].flog=;
- sort(edge,edge+m,cmp);
- minn=;
- for(int i=;i<m;i++)//找到最小生成树
- {
- int fx=find(edge[i].u);
- int fy=find(edge[i].v);
- if(fx!=fy)
- {
- pre[fx]=fy;
- edge[i].flog=;//标记这条边在最小生成树中已经用过
- minn+=edge[i].val;
- }
- }
- int flag=;
- for(int i=;i<m;i++)
- {
- if(edge[i].flog)//每次排除一条边
- {
- init();
- if(F(i)==minn)
- {
- flag=;
- break;
- }
- }
- if(flag) break;
- }
- if(flag) printf("Yes\n");
- else printf("No\n");
- }
- return ;
- }
Nyoj 修路方案(次小生成树)的更多相关文章
- hdu4081 秦始皇修路(次小生成树)
题目ID:hdu4081 秦始皇修路 题目链接:点击打开链接 题目大意:给你若干个坐标,每个坐标表示一个城市,每个城市有若干个人,现在要修路,即建一个生成树,然后有一个魔法师可以免费造路(不消耗人 ...
- nyoj_118:修路方案(次小生成树)
题目链接 题意,判断次小生成树与最小生成树的权值和是否相等. 豆丁文档-- A-star和第k短路和次小生成树和Yen和MPS寻路算法 法一: 先求一次最小生成树,将这棵树上的边加入一个向量中,再判断 ...
- 修路方案 Kruskal 之 次小生成树
次小生成树 : Kruskal 是先求出来 最小生成树 , 并且记录下来所用到的的边 , 然后再求每次都 去掉最小生成树中的一个边 , 这样求最小生成树 , 然后看能不能得到 和原来最小生成树一样的 ...
- 修路方案(nyoj)
算法:次小生成树 描述 南将军率领着许多部队,它们分别驻扎在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,由于交通不太便利,南将军准备修 ...
- hdu4081 次小生成树变形
pid=4081">http://acm.hdu.edu.cn/showproblem.php?pid=4081 Problem Description During the Warr ...
- HDU 4081 Qin Shi Huang's National Road System 次小生成树变种
Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
随机推荐
- 使用 Gradle 插件进行代码分析(转)
代码分析在大多数项目中通常是作为最后一个步骤(如果做了的话)完成的.其通常难以配置及与现有代码整合. 本文旨在勾勒出使用 Gradle 整合 PMD 与 FindBugs 的步骤,并将其与一个现有的 ...
- 揭秘传智播客毕业班的超级薪水7k内幕系列II----Offer工资表5.7k,为什么不能让老师就业就业
在上海传智播客宋学生Java六期学员.在班级尚未毕业阶段,私自投递简历,而且逃课去面试,获得某国企的Offer.入职薪资5.7K,,兼有五险一金.饭补等齐全福利,因就业老师要求班级同学未毕业不要急于就 ...
- 从零开始做UI-静电的sketch设计教室 视频教程
全套31集目录 01-初识Sketch http://www.ui.cn/detail/52223.html02-sketch的下载与安装 http://www.ui.cn/detail/5222 ...
- C#中的Virtual
在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtual. 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new ...
- HTC M7日文版HTL22刷机包 毒蛇2.5.0 ART NFC Sense6.0
ROM介绍 日文版的蝰蛇2.5.0简短的介绍: *根据最新的M8蝰蛇版本号2.5.0 *经过我的朋友和机器测试.功能是否正常,当然,并非所有的功能进行测试,以,假设遇到BUG请反馈 *删除国外社会.谷 ...
- 【C语言探索之旅】 第一部分第四课第二章:变量的世界之变量声明
内容简介 1.课程大纲 2.第一部分第四课第二章:变量的世界之变量声明 3.第一部分第四课第三章预告:变量的世界之显示变量内容 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布 ...
- JCombox
A component that combines a button or editable field and a drop-down list. The user can select a val ...
- SQL Server数据库附加失败:错误5120和错误950
再次敲机房,想參考曾经的物理模型,结果在附加数据库这一环节出现了点问题,以下总结一下. 1.附加数据库失败,错误5120 对于这样的错误,我在网上搜集了一下,主要有下面几种解决的方法: 方法一:将要附 ...
- HDU 2063:过山车(偶匹配,匈牙利算法)
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 软体project(两)——软体project
每本书的第一章,都是在讲宏观的东西.软工也不例外.接下来.我们就要介绍软件project"是什么"的问题. 一.是什么? watermark/2/text/aHR0cDov ...