最小瓶颈生成树
最小瓶颈生成树
瓶颈生成树,即对于图 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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?