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 ...
随机推荐
- 从 0 到 1 实现 React 系列 —— 4.setState优化和ref的实现
看源码一个痛处是会陷进理不顺主干的困局中,本系列文章在实现一个 (x)react 的同时理顺 React 框架的主干内容(JSX/虚拟DOM/组件/生命周期/diff算法/setState/ref/. ...
- LeetCode 965. Univalued Binary Tree
A binary tree is univalued if every node in the tree has the same value. Return true if and only if ...
- nginx Location 语法基础知识
URL地址匹配是Nginx配置中最灵活的部分 Location 支持正则表达式匹配,也支持条件匹配,用户可以通过location指令实现Nginx对动丶静态网页的过滤处理. Nginx locatio ...
- C#格式化字符串大全
C#格式化字符串大全 分类: VS/C# 1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}" ...
- scrapy之环境安装
scrapy之环境安装 在之前我安装了scrapy,但是在pycharm中却无法使用. 具体情况是: 我的电脑上存在多个python,有python2,python3,anaconda,其中anaco ...
- 【学亮IT手记】jQuery each()函数用法实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- java类型的小知识List 等
List 复制之 浅拷贝与深拷贝 详细连接https://blog.csdn.net/never_tears/article/details/79067245 java中判断字符串是否为数字的方法的几 ...
- 使用 idea 产生错误The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized
解决方法 spring.datasource.url=jdbc:mysql://localhost:3306/spring_cache?serverTimezone=GMT%2B8
- python爬虫之scrapy安装(一)
简介: Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrap ...
- linux查看端口是否开放
在讨论这个问题前,我们先来了解一下物理端口.逻辑端口.端口号等计算机概念. 端口相关的概念: 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL M ...