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
-
Prim+次小生成树!
-
次小生成树的两种算法:算法1、step 1. 先用prim求出最小生成树T. 在prim的同时,用一个矩阵max[u][v] 记录 在T中连结任意两点u,v的唯一的 路中权值最大的那条边的权值. (注意这里). 这是很容易做到的,因为prim是每次增加一个结点s, 而设已经标号了的结点 集合为W, 则W中所有的结点到s的路中的最大权值的边就是当前加入的这条边. step 1 用时 O(V^2). step 2. 枚举所有不在T中的边uv, 加入边uv则必然替换权为max[u][v]的边。算法2、先用prim求出最小生成树T。 枚举T中的每一条边,把它删除,求剩下的图的最小生成树。选所有枚举得到的生成树中的最小的那一个。
-
AC码:
-
#include<stdio.h> #include<string.h> #define INF 99999999 int G[505][505],visit[505],lowcost[505]; int repair[505][505],pre[505],f[505][505]; int main() {int T,v,e,a,b,cost,MinTree,ans,i,j,k,min;scanf("%d",&T);while(T--){scanf("%d%d",&v,&e);//memset(G,INF,sizeof(G)); // 对矩阵G赋值,只能赋为0或-1,如果赋为INF,提交不成功for(i=0;i<=v;i++){for(j=0;j<=v;j++)G[i][j]=INF;}memset(repair,0,sizeof(repair));for(i=0;i<e;i++){scanf("%d%d%d",&a,&b,&cost);G[a][b]=G[b][a]=cost;// 把该边初始为可修状态repair[a][b]=repair[b][a]=1; // repair:修}// Prim算法生成最小树memset(visit,0,sizeof(visit));memset(f,0,sizeof(f));for(i=1;i<=v;i++){lowcost[i]=G[1][i]; // 初始化lowcost的值pre[i]=1; // 辅助数组}visit[1]=1;k=1;MinTree=0;for(i=1;i<=v;i++){min=INF;for(j=1;j<=v;j++){if(!visit[j]&&min>lowcost[j]){min=lowcost[j];k=j;}}if(min==INF)break;repair[pre[k]][k]=repair[k][pre[k]]=0;MinTree+=min;visit[k]=1;for(j=1;j<=v;j++){if(visit[j])f[k][j]=f[j][k]=f[j][pre[k]]>G[pre[k]][k]?f[j][pre[k]]:G[pre[k]][k];if(!visit[j]&&G[k][j]<lowcost[j]){lowcost[j]=G[k][j];pre[j]=k;}}}// 再求次小生成树ans=INF;for(i=1;i<=v;i++){for(j=1;j<=v;j++){if(repair[i][j])ans=ans<(MinTree-f[i][j]+G[i][j])?ans:(MinTree-f[i][j]+G[i][j]);}}if(ans==MinTree)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,由于交通不太便利,南将军准备修路. ...
- NYOJ118 修路方案 次小生成树
修路方案 时间限制: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 修路方案(求次小生成树)
题目118 题目信息 运行结果 本题排行 讨论区 修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市 ...
- 修路方案(次小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- NYOJ 118 次小生成树
1.Question: 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. 现在已经知道哪些城市之间可以修路,如果修路,花费是多少. ...
最新文章
- java编译错误 程序包javax.servlet不存在javax.servlet.*
- 2022年3月14日蓝桥杯基础算法能力测试
- Java正则表达式中的反向引用
- kaggle共享单车数据分析及预测(随机森林)
- udl 连mysql_自己如何正确获取MYSQL的ADO连接字符串
- HTML5 小动画例子
- 查看linux应用zabbix版本
- 接口与interface关键字
- Netty4.0学习笔记系列之一:Server与Client的通讯
- OpenGL编程指南(原书第8版)环境搭建
- 公开课可下载资源汇总
- vb mysql登录界面_vb.net 简单上机登陆(面向过程思维)
- 初探HazelCast IMDG内存数据网格-简介
- android判断音频是否是噪音,声音检测器sound detector(噪音分贝检测)
- word 要求五十行 50行
- 解读论文EPSILON: An Efficient Planning System for Automated Vehicles in Highly Interactive Environments
- 还有猛料?维基解密称只发布了已掌握美中情局文件的1%
- 为什么 2 * (i * i) 比 2 * i * i 效率高?
- 网易2019年Q3财报净利47.26亿元 从财报看网易的长期主义
- 第24课 Altium Designer20(AD20)+VESC6.4实战教程:长走线、元器件散热与GND铺铜的处理(北冥有鱼)