The Unique MST POJ - 1679 次小生成树prim
求次小生成树思路: 先把最小生成树求出来 用一个Max[i][j] 数组把 i点到j 点的道路中 权值最大的那个记录下来 used数组记录该条边有没有被最小生成树使用过 把没有使用过的一条边加入最小生成树必然回形成一条回路 在这条回路中减去 除加入的边的权值最大的一条边 原图必然保持连通 (如果此时 权值最大的边和新加入的边权值相同 则存在 不同的最小生成树) 把每一条边加入再删除后 即可得出次小生成树
参考了: https://blog.csdn.net/qq_33951440/article/details/53084248
https://blog.csdn.net/li1615882553/article/details/80011884
https://www.cnblogs.com/kuangbin/p/3147329.html
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include<vector>
- #include<iostream>
- #include<cstring>
- int ans;
- const int maxn=+;
- const int INF=;
- int x[maxn],y[maxn];
- int cost[maxn][maxn];
- int pre[maxn];
- int lowc[maxn];
- int Max[maxn][maxn];
- int vis[maxn];
- int parent[maxn];
- int used[maxn][maxn];
- using namespace std;
- int prim(int cost[][maxn],int n){
- int ans=;
- memset(vis,false,sizeof(vis));
- memset(Max,,sizeof(Max));
- memset(used,false,sizeof(used));
- vis[]=;
- pre[]=-;
- for(int i=;i<n;i++){
- lowc[i]=cost[][i];//刚开始只有v0在生成树中 生成树和不在生成树的距离 就是v0和 其他点的距离
- pre[i]=;
- }
- for(int i=;i<n;i++){
- int minc=INF;
- int p=-;
- for(int j=;j<n;j++){
- if(!vis[j]&&minc>lowc[j]){//找出到树最短的变
- minc=lowc[j];
- p=j;
- }
- }
- if(p==-)return -; //不连通
- ans+=minc;
- vis[p]=;
- used[p][pre[p]]=used[pre[p]][p]=; //该边设置为已使用
- for(int j=;j<n;j++){
- if(vis[j])Max[j][p]=Max[p][j]=max(Max[j][pre[p]],minc);//更新 j到p 的最大权值的边
- if(!vis[j]&&lowc[j]>cost[p][j]){
- lowc[j]=cost[p][j]; //更新树到点的最短距离
- pre[j]=p;//j点如果要进树 连p点 所以p就是j的父结点
- }
- }
- }
- return ans;
- }
- int smst(int cost[][maxn],int n){ //计算是否可以删除一条边 仍得到所有边权值不变
- int minnum=INF;
- for(int i=;i<n;i++){
- for(int j=i+;j<n;j++){
- if(cost[i][j]!=INF&&!used[i][j]){
- minnum=min(minnum,ans+cost[i][j]-Max[i][j]);
- }
- }
- }
- return minnum;
- }
- int main()
- {
- int t;
- cin>>t;
- while(t--){
- int n,m;
- scanf("%d%d",&n,&m);
- int u,v,w;
- for(int i=;i<n;i++){
- for(int j=;j<n;j++){
- if(i==j)cost[i][j]=;
- else cost[i][j]=INF;
- }
- }
- while(m--){
- int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- u--,v--;
- cost[u][v]=cost[v][u]=w;
- }
- ans=prim(cost,n);
- if(ans==smst(cost,n)){
- printf("Not Unique!\n");
- }
- else printf("%d\n",ans);
- }
- return ;
- }
The Unique MST POJ - 1679 次小生成树prim的更多相关文章
- The Unique MST POJ - 1679 (次小生成树)
Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spann ...
- Day5 - G - The Unique MST POJ - 1679
Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spann ...
- POJ 1679 The Unique MST 【最小生成树/次小生成树模板】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22668 Accepted: 8038 D ...
- poj1679 The Unique MST(判定次小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23180 Accepted: 8235 D ...
- poj 1679 次小生成树
次小生成树的求法: 1.Prime法 定义一个二维数组F[i][j]表示点i到点j在最小生成树中的路径上的最大权值.有个知识就是将一条不在最小生成树中的边Edge加入最小生成树时,树中要去掉的边就是E ...
- K - The Unique MST - poj 1679
题目的意思已经说明了一切,次小生成树... ****************************************************************************** ...
- (最小生成树 次小生成树)The Unique MST -- POJ -- 1679
链接: http://poj.org/problem?id=1679 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82831#probl ...
- The Unique MST POJ - 1679 最小生成树判重
题意:求一个无向图的最小生成树,如果有多个最优解,输出"Not Unique!" 题解: 考虑kruskal碰到权值相同的边: 假设点3通过边(1,3)连入当前所维护的并查集s. ...
- UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
思路: Prim: 这道题目中有重边 Prim可以先加一个sec数组来保存重边的次小边,这样不会影响到最小生成树,在算次小生成树时要同时判断次小边(不需判断是否在MST中) Kruskal: Krus ...
随机推荐
- IIS配置Url重写实现http自动跳转https的重定向方法(100%解决)
引言 本文推荐阅读地址:https://www.52abp.com/BlogDetails/10008 这种文章网上可以说一搜一大把,但是我为什么还要写呢,因为一搜一把没把我气死,都是东抄西挪的东西, ...
- vue开发中regeneratorRuntime is not defined
我的项目是用vue提供的vue-cil脚手架生成的项目,但是当我在项目中使用async/await,编译代码的的时候报了regeneratorRuntime is not defined的错,我查过资 ...
- AQS解析(未完成)
参考:Java并发之AQS详解 同步队列和condition等待队列.获取到锁的线程则处于可运行状态,而未获取到锁的线程则被添加到同步队列中,等待获取到锁的线程释放锁. 一.数据结构 Node sta ...
- jmeter之批量修改请求路径
今天工作时碰到一个问题:测试环境中由于tomcat没指定webapps下的文件夹名,导致tomcat使用了webapps下默认的文件夹名,而我的jmeter脚本都已经做出来了,一共83个接口,挨个改路 ...
- js中的一些方法
数组 //map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果. 返回值:一个新数组,每个元素都是回调函数的结果. var array1 = [1, 4, 9, ...
- Jmeter之Constant Timer与constant throughput timer的区别(转)
当放置Constant Timer于两个http请求之间,那么它代表的含义是:在上一个请求发出至完成后, 开始Contant Timer指定的时间,最后再发出第二个请求.它并不是代表两个请求之间的发送 ...
- vue单页面模板说明文档(3)
Environment Variables Sometimes it is practical to have different config values according to the env ...
- laravel创建项目
composer create-project --prefer-dist laravel/laravel=5.5.* blog
- 123. 单词搜索(DFS)
描述 给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词. 单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻.每个单元中的字母最多只能使用一次. 样例 给出 ...
- mybatis一级缓存详解
mybatis缓存分为一级缓存,二级缓存和自定义缓存.本文重点讲解一级缓存 一:前言 在介绍缓存之前,先了解下mybatis的几个核心概念: * SqlSession:代表和数据库的一次会话,向用户提 ...