POJ1679 The Unique MST(次小生成树)
可以依次枚举MST上的各条边并删去再求最小生成树,如果结果和第一次求的一样,那就是最小生成树不唯一。
用prim算法,时间复杂度O(n^3)。
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 111
#define INF (1<<30)
struct Edge{
int u,v;
}edge[MAXN];
int NE; int n,G[MAXN][MAXN];
int lowcost[MAXN],nearvex[MAXN];
int prim(bool statue){
for(int i=;i<=n;++i) lowcost[i]=INF;
lowcost[]=;
int res=;
for(int i=; i<n; ++i){
int u=-,min=INF;
for(int v=; v<=n; ++v){
if(lowcost[v]!=- && lowcost[v]<min){
min=lowcost[v];
u=v;
}
}
if(u==-) return -;
if(statue && u!=){
edge[NE].u=nearvex[u]; edge[NE].v=u;
++NE;
}
lowcost[u]=-;
res+=min;
for(int v=; v<=n; ++v){
if(lowcost[v]!=- && lowcost[v]>G[u][v]){
lowcost[v]=G[u][v];
nearvex[v]=u;
}
}
}
return res;
} bool isUnique(int res){
for(int i=; i<NE; ++i){
int tmp=G[edge[i].u][edge[i].v];
G[edge[i].u][edge[i].v]=G[edge[i].v][edge[i].u]=INF;
if(prim()==res) return ;
G[edge[i].u][edge[i].v]=G[edge[i].v][edge[i].u]=tmp;
}
return ;
} int main(){
int t,m,a,b,c;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i){
for(int j=; j<=n; ++j) G[i][j]=INF;
}
for(int i=; i<m; ++i){
scanf("%d%d%d",&a,&b,&c);
G[a][b]=G[b][a]=c;
}
NE=;
int res=prim();
if(isUnique(res)) printf("%d\n",res);
else puts("Not Unique!");
}
return ;
}
有O(n^2)的算法,详见http://www.cnblogs.com/hxsyl/p/3290832.html。
算法,需要求出MST上任意两点路径上的最长边,删除这条边会形成两个连通分支而那两点就分别在这两个连通分支里;
然后依次枚举所有不在MST上的边,删除边上两点路径上的最长边并加入MST,这样就构成另外一颗生成树了,并且是存在该边的前提下的最小生成树。
计算MST任意两点路径上的最长边,可以在prim算法的过程中求出:每当一个点加入T集合前,计算出所有T集合的点到该点的最长边。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 111
#define INF (1<<30) int n,G[MAXN][MAXN];
bool vis[MAXN][MAXN];
int lowcost[MAXN],nearvex[MAXN],maxedge[MAXN][MAXN];
int T[MAXN],NT;
int prim(){
memset(vis,,sizeof(vis));
memset(maxedge,,sizeof(maxedge));
NT=;
nearvex[]=;
for(int i=; i<=n; ++i) lowcost[i]=INF;
lowcost[]=; int res=;
for(int i=; i<n; ++i){
int u=-,mincost=INF;
for(int v=; v<=n; ++v){
if(lowcost[v]!=- && lowcost[v]<mincost){
mincost=lowcost[v];
u=v;
}
} vis[nearvex[u]][u]=vis[u][nearvex[u]]=;
for(int i=; i<NT; ++i) maxedge[T[i]][u]=maxedge[u][T[i]]=max(maxedge[T[i]][nearvex[u]],mincost);
T[NT++]=u; res+=mincost;
lowcost[u]=-;
for(int v=; v<=n; ++v){
if(lowcost[v]!=- && lowcost[v]>G[u][v]){
lowcost[v]=G[u][v];
nearvex[v]=u;
}
}
}
return res;
} int SMST(){
int res=INF;
for(int i=; i<=n; ++i){
for(int j=i+; j<=n; ++j){
if(vis[i][j] || G[i][j]==INF) continue;
res=min(res,G[i][j]-maxedge[i][j]);
}
}
return res;
} int main(){
int t,m,a,b,c;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i){
for(int j=; j<=n; ++j) G[i][j]=INF;
}
while(m--){
scanf("%d%d%d",&a,&b,&c);
G[a][b]=G[b][a]=c;
}
int res=prim();
if(SMST()==) puts("Not Unique!");
else printf("%d\n",res);
}
return ;
}
POJ1679 The Unique MST(次小生成树)的更多相关文章
- POJ1679 The Unique MST[次小生成树]
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28673 Accepted: 10239 ...
- POJ1679 The Unique MST —— 次小生成树
题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total S ...
- POJ-1679 The Unique MST,次小生成树模板题
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Description Given a connected undirec ...
- POJ 1679 The Unique MST (次小生成树 判断最小生成树是否唯一)
题目链接 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. De ...
- POJ_1679_The Unique MST(次小生成树)
Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...
- POJ_1679_The Unique MST(次小生成树模板)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23942 Accepted: 8492 D ...
- POJ 1679 The Unique MST (次小生成树)
题目链接:http://poj.org/problem?id=1679 有t组数据,给你n个点,m条边,求是否存在相同权值的最小生成树(次小生成树的权值大小等于最小生成树). 先求出最小生成树的大小, ...
- poj1679The Unique MST(次小生成树模板)
次小生成树模板,别忘了判定不存在最小生成树的情况 #include <iostream> #include <cstdio> #include <cstring> ...
- POJ 1679 The Unique MST (次小生成树kruskal算法)
The Unique MST 时间限制: 10 Sec 内存限制: 128 MB提交: 25 解决: 10[提交][状态][讨论版] 题目描述 Given a connected undirect ...
- poj 1679 The Unique MST (次小生成树(sec_mst)【kruskal】)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35999 Accepted: 13145 ...
随机推荐
- [Effective JavaScript 笔记] 第12条:理解变量声明提升
js支持词法作用域,即除了极少的例外,对变量的引用会被绑定到声明变量最近的作用域中. js不支持块级作用域,即变量定义的作用域并不是离其最近的封闭语句或代码块,而是包含它们的函数. 不了解这个会产生一 ...
- DCMTK3.6.1(MD支持库)安装说明
转载:http://qimo601.iteye.com/blog/1685135 [前言] 最近,因为需要开发DICOM网管模块,必须使用DCMTK的DcmNet模块.但是DCMTK3.6.0在Dcm ...
- django admin 扩展
添加自定义动作: 例子,添加一个方法,批量更新文章,代码如下: from django.contrib import admin from myapp.models import Article de ...
- /lib /usr/lib /usr/local/lib区别
昨天问我/usr/lib 和/usr/local/lib 我仅记得一个是系统的,一个是用户的,于是今天查了查,有两篇文章介绍的不错,usr 很多人都认为是user缩写,其实不然,是unix syste ...
- SharePoint 2010整体进行验证
http://www.cnblogs.com/Sunmoonfire/archive/2010/02/09/1666861.html SharePoint 2010的一个新特性就是在列表条目创建时会针 ...
- HTTP认证相关
Java HTTPBasicAuth http://blog.csdn.net/kkdelta/article/details/28419625Python HTTPBasicAuth http:// ...
- 【转】仿百度输入框智能提示的js代码
转自:http://www.jb51.net/article/40783.htm 对于我这个JS菜鸟,能找到这样的实属不容易啊!!! 刚开始老大让做这个功能,真是一点头绪都没有,万分感谢!!! 最近客 ...
- iOS 在使用UINavigationController和TabBarController时view的frame
可能是以前记错了,总认为在ios6上使用了UINavigationController或者TabBarController会因为多了bar而影响子controller的view的frame大小.今天在 ...
- Linux服务器通过rz/sz轻松上传下载文件
Linux服务器通过命令行远程访问时,上传文件还需要ftp所以不太方便,可以使用rz这个小工具来上传不太大的文件,方法如下: 输入rz,如果提示命令不存在,证明还没有安装,以CentOS为例,安装命令 ...
- CodeForces - 420A (字符对称问题)
Start Up Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Sta ...