动态连通算法
来源:互联网 发布:mac手游模拟器电脑版 编辑:程序博客网 时间:2024/06/18 15:56
修改了好久嗯,在随机生成的整数对理想的情况下能较快处理几十万以内随机数对全部连通问题
测试类:
/** * Created by 小林未郁 on 2016/7/17. */import java.util.Random;import java.util.Scanner;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.PrintStream;public class TestClass { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("please enter a 'N'"); count(input.nextInt()); } static void count(int N) { try { System.setOut(new PrintStream(new FileOutputStream("system_out.txt"))); } catch (FileNotFoundException ex) { ex.printStackTrace(); return; } PathCompressionUF fuck = new PathCompressionUF(N); Random rand = new Random(); int i = 0; int j = 0; int flag=0; for (; ; ) { while (true) { i = rand.nextInt(N); j = rand.nextInt(N); if (i == j) { continue; } else { if (fuck.connected(i, j)) { break; } else { fuck.union(i, j); System.out.println(i + " " + j); flag++; break; } } }//0.1,非常保守的一个参数 if(flag<N*0.1){ continue; }else { if (fuck.judge()) { break; } else { continue; } } } System.out.println("执行完毕!"); }}实现类:
/** * Created by 小林未郁 on 2016/8/4. */public class PathCompressionUF { private int count; private int[] id; private int[] sz; PathCompressionUF(int N) { count = N; id = new int[N]; sz = new int[N]; for (int i = 0; i < N; i++) { id[i] = i; sz[i] = 1; } } public int find(int p) { int temp = p; while (p != id[p]) { p = id[p]; } while (temp != id[temp]) { int temp1 = id[temp]; id[temp] = p; temp = temp1; } return p; } public void union(int p, int q) { int i = find(p); int j = find(q); if (i == j) { return; } if (sz[i] <= sz[j]) { id[i] = j; sz[j] += sz[i]; } else { id[j] = i; sz[i] += sz[j]; } count--; } public boolean connected(int p, int q) { return find(p) == find(q); } public int count() { return count; } public boolean judge(){ int bitch=id[0]; for(int i=0;i<id.length;i++){ if(connected(bitch,id[i])) continue; else return false; } return true; }}
随机生成的数对全部都写入到一个文件里了,如图是输入为200000时的情形,共生成了一百多万对随机数,处理时间大概用了不到十秒.judge我从平方复杂度优化到了线性的,但是judge应该还能再优化我感觉..但是不知道怎么写了,以后再写
1 0
- 动态连通算法
- 连通问题算法
- 强连通分支算法
- 强连通算法
- 强连通分量算法
- 连通分量标记算法
- 强连通算法--Tarjan
- 算法篇-5-动态规划-01背包&流水作业调度&&整数线性规划&树的最大连通分支
- 强连通图的算法
- 4连通边界填充算法
- 强连通分量 Tarjan算法
- 强连通分量_Kosaraju算法
- 强连通分量 Kosaraju算法
- 强连通分量 tarjan算法
- 算法之强连通分支
- Korsaraju算法 强连通分量
- 强连通分量-Tarjin算法
- 强连通分量Tarjan算法
- uva11090
- HDU 1598 find the most comfortable road (并查集+贪心)
- Socket 与 WebSocket
- 非常全面的 Android Bitmap 知识点梳理
- 斐波那契博弈(Fibonacci Nim)
- 动态连通算法
- 删除项目里面所有.svn和.git 文件
- ffmpeg cross-compile
- Django Channels简明实践
- hdu 5802 Windows 10 (贪心+dfs)
- 摇摆子序列问题
- dubbo管理平台安装部署
- vs2005下C++开发遇到的CSTring与string之间的转化
- [HDU 5800] To My Girlfriend (计数DP)