无向图的最小环问题
考试时候记错方法,然后还有其他一堆错误然后寄掉了。
你TM学了个JB。
所以写一篇
无向图的最小环问题
解法一,,
for(int k = 1; k <= n; ++k){
for(int i = 1; i < k; ++i)if(k != i)
for(int j = i + 1; j < k; ++j)if(i != j && j != k){
if(mp[i][k] + mp[k][j] + dis[i][j] < len){
len = mp[i][k] + mp[k][j] + dis[i][j];
ans = f[i][j];
}else if(mp[i][k] + mp[k][j] + dis[i][j] == len){
ans += f[i][j];
}
}
for(int i = 1; i <= n; ++i)if(k != i)
for(int j = 1; j <= n; ++j)if(i != j && j != k){
if(dis[i][j] > dis[i][k] + dis[k][j]){
dis[i][j] = dis[i][k] + dis[k][j];
f[i][j] = f[i][k] * f[k][j];
}else if(dis[i][j] == dis[i][k] + dis[k][j]){
f[i][j] += f[i][k] * f[k][j];
}
}
}
解法二,最短路
枚举一条边,删去它,跑两个点的最短路,更新答案
根据最短路的实现方式有不同的复杂度
一些拓展,(或许某些只适用于边权都为 的情况)
一种做法,枚举一个点,然后 ,在访问到之前访问过的点时候进行更新
需要注意的是,严格做法应该为从根出发的不同边对应的子树染上不同的颜色,对于连接两个不同颜色的边进行更新
但是由于找最小环,不染色得到的非法方案一定不是最优解,所以一般不管
比如今天
这个东西能跑的更快
做法是按照度数从大到小枚举点,从该点出发 , 两个剪枝
-
深度大于已经找出的最小环长度的一半(上取整)直接返回
-
之前当过根的点删去,不再进行
随机数据下接近线性,卡的话目前只有卡到根号的方法,详情咨询
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】