最小环
来源:互联网 发布:金牌淘宝客服培训计划 编辑:程序博客网 时间:2024/05/11 16:35
算法:
在一个图中求出一个路径长度最小的环。首先,我们可以想到迪杰斯特拉算法,计算出
dis[src,i] +map[i][src] ,然后维护一个最大值就好了。但是这样做的话,在计算dis[src,i] 时有可能会把map[i][src] 包含进去,那么怎么办呢,我们可以枚举每一条边,先删掉,然后求dis[src,i] ,再计算dis[src,i] +map[i][src] ,这样就不会错了。但是,我们有更好的算法,floyd 算法求最小环,我们枚举一个环的起点i 和终点j ,那么map[i][k]+map[k][j]+dp[i][j] 就是一个最小候选环,其中dp[i][j] 是没有被比k 大的结点松弛过,也就是说,dp[i][j] 没有经过k 结点,那么这个过程完全可以在floyd 算法的三重循环下一起完成。最后在算法的过程中加入路径记录,最后就可以输出路径了。
代码:
int N,M;int map[SIZE][SIZE];int dp[SIZE][SIZE];int pre[SIZE][SIZE];int ans;int path[SIZE];int top;void floyd(){ int i,j,k; for(k=1;k<=N;k++){ int tmp; for(i=1;i<k;i++) for(j=i+1;j<k;j++){ tmp=dp[i][j]+map[i][k]+map[k][j]; if(tmp<ans){ ans=tmp; top=0; int p=j; while(p!=i) path[top++]=p,p=pre[i][p]; path[top++]=i; path[top++]=k; } } for(i=1;i<=N;i++) for(j=1;j<=N;j++) if(dp[i][j]>dp[i][k]+dp[k][j]) dp[i][j]=dp[i][k]+dp[k][j], pre[i][j]=pre[k][j]; }}
0 0
- 最小环
- 最小环
- 最小环
- floyd求最小环
- 最小环 timus1004
- floyed求最小环
- floyd求最小环
- 【最小环】Sightseeing Trip
- poj1734 最小环
- floyd求最小环
- hdu 1599 最小环
- floyd求最小环
- FLOYD 求最小环
- 【图论】最小环算法
- hdu 1599 最小环
- floyd求最小环
- floyd最小环
- 最小环(floyd)
- J2EE项目中后台定时运行的程序
- UVA 11806 容斥原理
- 稀疏矩阵存储格式
- Ubuntu 下Caffe的安装过程 -- TIPS
- 学生优化总结
- 最小环
- spinner自定义及实现三级联动
- 状压DP A-Mondriaan's Dream
- [LeetCode] 95. Unique Binary Search Trees II
- CADisplayLink 与NSTimer区别
- UltraEdit恢复标签式显示
- Java常用技巧总结
- POJ-3020-Antenna Placement
- 推送码