【POJ 1679】The Unique MST(次小生成树)

找出最小生成树,同时用Max[i][j]记录i到j的唯一路径上最大边权。然后用不在最小生成树里的边i-j来替换,看看是否差值为0。

#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=101;
const int INF=0x3f3f3f3f;
int n,m,ans,s;
int lowc[N],vis[N],g[N][N];
int Max[N][N],fa[N],used[N][N];
int Prim(){
	int ans=0;
	memset(Max,0,sizeof Max);
	memset(used,0,sizeof used);
	memset(vis,0,sizeof vis);
	vis[0]=1;
	for(int i=1;i<n;i++){
		lowc[i]=g[0][i];fa[i]=0;
	}
	for(int i=1;i<n;i++){
		int p=0;
		while(vis[p])p++;
		for(int j=p+1;j<n;j++)
			if(!vis[j] && lowc[j]<lowc[p])
				p=j;
		if(lowc[p]==INF)return -1;//原图不连通
		ans+=lowc[p];
		vis[p]=1;
		used[p][fa[p]]=used[fa[p]][p]=1;
		for(int j=0;j<n;j++)
			if(vis[j])
				Max[j][p]=Max[p][j]=max(Max[j][fa[p]],lowc[p]);					else if(g[p][j]<lowc[j]){
				lowc[j]=g[p][j];
				fa[j]=p;
			}
	}
	return ans;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		memset(g,INF,sizeof g);
		scanf("%d%d",&n,&m);
		while(m--){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			u--;v--;
			g[u][v]=g[v][u]=w;
		}
		ans=Prim();
		s=INF;
		for(int i=0;i<n;i++)
			for(int j=i+1;j<n;j++)
				if(g[i][j]!=INF&&!used[i][j])
					s=min(s,g[i][j]-Max[i][j]);

		if(ans==-1||s==0)
			puts("Not Unique!");
		else
			printf("%d\n",ans);
	}
	return 0;
}

  wa了好几发,原因是,s初始化为ans,而如果ans本身就是0的话,应该是唯一的最小生成树。

时间: 2024-08-08 13:56:08

【POJ 1679】The Unique MST(次小生成树)的相关文章

poj 1679 The Unique MST (次小生成树)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20293   Accepted: 7124 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

poj 1679 The Unique MST (次小生成树(sec_mst)【kruskal】)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35999   Accepted: 13145 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undir

POJ - 1679 The Unique MST(次小生成树)

版权声明:本文为博主原创文章,未经博主允许不得转载.

hdu 1679 The Unique MST 次小生成树 简单题

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21737   Accepted: 7692 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

POJ - 1679 The Unique MST (次小生成树)

Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of G, say T = (V', E'), with the followin

poj 1679 The Unique MST 【次小生成树】【模板】

题目:poj 1679 The Unique MST 题意:给你一颗树,让你求最小生成树和次小生成树值是否相等. 分析:这个题目关键在于求解次小生成树. 方法是,依次枚举不在最小生成树上的边,然后添加到最小生成树上,然后把原树上添加了之后形成环的最长的边删去,知道一个最小的.就是次小生成树. 这些需要的都可以在求解最小生成树的时候处理出来. AC代码: #include <cstdio> #include <cstring> #include <iostream> #i

poj 1679 The Unique MST (判断最小生成树是否唯一)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20679   Accepted: 7255 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

POJ 1679 The Unique MST(求最小生成树是否唯一)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20430   Accepted: 7186 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

POJ 1679 The Unique MST 【最小生成树/次小生成树】

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22668   Accepted: 8038 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

poj 1679 The Unique MST (判定最小生成树是否唯一)

题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29408   Accepted: 10520 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spannin