最小瓶颈生成树

最小瓶颈生成树

瓶颈生成树,即对于图 G 中的生成树树上最大的边权值在所有生成树中最小。
对于无向图来说,无向图的最小生成树一定是最小瓶颈生成树,但最小瓶颈生成树不一定是最小生成树。
因此,使用 Kruskal 算法即可求出无向图的最小瓶颈生成树。
这个算是之前的知识盲点吧,毕竟对MST认识还不够深刻...
不然我还真觉得MST没有什么用处...

P2502 [HAOI2006]旅行

不看题解我真不知道怎么做...
Kruscal生成树算法生成的最小生成树是一个瓶颈生成树。
(瓶颈生成树即所有生成树里面最大边最小的一个)来自题解
最小生成树就好说多了
枚举最小边,再枚举最小化的最大边(就是最小瓶颈生成树上的边)
时间复杂度O(m^2)
然后为了防止卡精度,乘法代替除法

//luoguP2502 [HAOI2006]旅行
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll N=1e4+10;
const ll inf=1e9+7;

ll read() {

	ll x=0,f=1;
	char ch=getchar();
	while(ch<48||ch>57) {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>=48&&ch<=57) {
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;

}

struct kr{
	
	ll u,v,w;
	
}a[N];

int tot=0;
void add(ll u,ll v,ll w) {
	
	a[++tot].u=u;
	a[tot].v=v;
	a[tot].w=w;
	
}

bool cmp(kr x,kr y) {
	
	return x.w<y.w;
	
}

ll n,m,s,t,fa[N],cnt=0;

ll find(ll x) {
	
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
	
} 

int main() {
	
	n=read();
	m=read();
	
	for(ll i=1;i<=n;i++) fa[i]=i;
	for(ll i=1;i<=m;i++) {
		
		ll u=read(),v=read(),w=read();
		add(u,v,w);
		add(v,u,w);
		fa[find(u)]=find(v);
		
	}
	s=read();
	t=read();
	if(find(s)!=find(t)) {
		
		printf("IMPOSSIBLE\n");
		
	} else {
		
		ll maxn=inf,minn=1;
		sort(a+1,a+tot+1,cmp);
		for(ll i=1;i<=tot-1;i++) {
			
			bool fl=0;
			ll o;
			for(ll j=1;j<=n;j++) fa[j]=j;
			for(ll j=i;j<=tot;j++) {
				
				if(find(s)==find(t)) {
					fl=1;
					break;
				}
				o=j;
				fa[find(a[j].u)]=find(a[j].v);
				
			}
			if(!fl) break;
			if(a[o].w*minn<a[i].w*maxn) {
				minn=a[i].w;
				maxn=a[o].w;
			}
			
		}
		
		ll gcd=__gcd(maxn,minn);
		maxn/=gcd;
		minn/=gcd;
		if(maxn%minn) printf("%lld/%lld\n",maxn,minn);
		else printf("%lld\n",maxn/minn);
		
	}
	
	return 0;
}

posted @   Diamondan  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示