POJ 1679

原创 2016年08月31日 04:48:19

题意:判断求出的最小生成树唯不唯一,唯一输出最小的权值,否者输出Not unique!

思路:先求出一个最小生成树来,那么在这个最小生成树中任意添加一条边就能构成环,那么我们枚举所有不再生成树中的边,加进生成树中,加上这条变的权值然后减去这条变两点之间在生成树中的一条最大的权值边,如果此时的权值等于所求出最小生成树的权值的话,那么最小生成树不唯一

#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int qq=110;
const int MAX=1e8+5;
int n,m;
int vis[qq];
int dis[qq];
int map[qq][qq];
int maxn[qq][qq];	//记录最小生成树中点i到点j的最大距离、 
int use[qq][qq];	//记录每一条边是否被使用过、 
int pre[qq];
int Prim()
{
	memset(vis,0,sizeof(vis));
	memset(use,0,sizeof(use));
	memset(maxn,0,sizeof(maxn)); 
	for(int i=1; i<=n; ++i)	dis[i]=map[1][i],pre[i]=1;
	vis[1]=1;
	dis[1]=0;
	pre[1]=-1; 
	int ans=0,minx,k;
	for(int i=1; i<n; ++i){
		minx=MAX;
		for(int j=1; j<=n; ++j)
			if(!vis[j] && dis[j]<minx)
				minx=dis[k=j];
		if(minx==MAX)	return -1; 
		ans+=minx;
		use[k][pre[k]]=use[pre[k]][k]=1;
		vis[k]=1;
		for(int j=1; j<=n; ++j){
			if(vis[j])	maxn[j][k]=maxn[k][j]=max(dis[k],maxn[j][pre[k]]);
			if(!vis[j] && map[k][j]<dis[j])
				pre[j]=k,dis[j]=map[k][j];
		}
	}
	return ans;
}
int main()
{
	int t;scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		int u,v,w;
		for(int i=0; i<=n; ++i)
			for(int j=0; j<=n; ++j)	
				if(i!=j)	map[i][j]=MAX;
				else map[i][j]=0; 
		for(int i=0; i<m; ++i){
			scanf("%d%d%d",&u,&v,&w);
			map[u][v]=map[v][u]=w;
		}
		int ans=Prim();
		if(ans==-1){
			printf("Not Unique!\n");
            continue;
		}
		int Min=MAX;
		for(int j,i=1; i<=n; ++i)
			for(j=i+1; j<=n; ++j)
				if(!use[i][j] && map[i][j]!=MAX)
					Min=min(Min,ans-maxn[i][j]+map[i][j]);
		if(Min==ans)	printf("Not Unique!\n");
		else	printf("%d\n",ans);
	}
	return 0;
}


版权声明:吸猫大法、 举报

相关文章推荐

POJ 1679 The Unique MST【最小生成树问题相关】

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26256  ...

poj 1679

这是一道求次小生成树的题目。        首先,介绍一下什么是次小生成树。设T是无向连通图G的最小生成树,对于另一棵生成树T1(T1不等于T),如果不存在T2(T2不等于T),满足T2的权值之和小...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

POJ 1679

求最小生成树是否唯一,即求次小生成树,判断它的边权和是否和最小生成树的一样。 还是用的kruskal算法,先求得最小生成树,再记录下路径,然后枚举删除最小生成树中的一条边,再构造新的生成树,看是否和...

POJ 1679

思路:就是将选好的边一条条的删了在看能不能找出相同的答案

[MST] poj 1679

/** [MST] poj 1679 判断一个图中的MST是否唯一。 先生成一颗MST,然后依次删除用过的且有多个相同权值的边重新建树,判断两棵树是否相等。 边的信息除u v c,还需要used(第一...

poj 1679 prim

判断最小生成树唯不唯一 根据prim算法,找出最小的那条边及点u,然后看看已属于T集合的有没有到达点u的距离和此最小边一样长,若有而且还不是点v,那么就证明有其他最小生成树. #i...

POJ 1679 The Unique MST

题目大意: 题目链接 注释代码: 无注释代码:

POJ-1679-The Unique MST

要求判断最小生成树是否唯一,用的Kruskal算法做即可。 最小生成树是否唯一的判断:         将最小生成树中的一条边去掉,看是否能够再次找到一个相等的最小生成树。 代码; #in...

Poj 1679 The Unique MST

题目描述: 给定一个连通无向网,判定它的最小生成树是否唯一。 输入描述: 输入文件的第1 行为一个整数t,1≤t≤20,表示测试数据的数目。每个测试数据描述了一个 连通无向网。每个测试数据的第...

poj 1679 The Unique MST

判断MST是否唯一,用次小生成树的方法,如果次小生成树和原来的最小的相等,就不唯一。 数据看来保证是连通的了。。 N^3的算法。。。如果把树存成链表,就是N^2算法了。悲剧的北京A题。。 #in...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)