HashMap在求解最大连通分量中的应用
应用 最大 求解 HashMap 连通 分量
2023-09-11 14:20:52 时间
1 基于DFS的连通分量数求解算法
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class Main {
static HashMap<Integer,Set> map=new HashMap<Integer,Set>();
static int n; //顶点数
static int e; //边数
static boolean[] flag; //标记顶点是否已访问
static int count=0; //连通分量数
public static void main(String[] args) {
makeGraph();
flag=new boolean[n];
for(int i=0;i<n;i++) {
if(!flag[i]) {
dfs(i);
count++;
}
}
System.out.println(count);
}
static void makeGraph() {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
e=sc.nextInt();
for(int i=0;i<e;i++) {
int a=sc.nextInt();
int b=sc.nextInt();
if(!map.containsKey(a)) {
Set<Integer> set=new HashSet<Integer>();
set.add(b);
map.put(a,set);
}else {
map.get(a).add(b);
}
if(!map.containsKey(b)) {
Set<Integer> set=new HashSet<Integer>();
set.add(a);
map.put(b,set);
}else {
map.get(b).add(a);
}
}
}
static void dfs(int index) {
flag[index]=true;
if(!map.containsKey(index)) {
return;
}
Iterator<Integer> iter=map.get(index).iterator();
while(iter.hasNext()) {
int v=iter.next();
if(!flag[v]) {
dfs(v);
}
}
}
}
2 基于分类的连通分量数求解算法
import java.util.HashMap;
import java.util.Scanner;
class Edge{ //边
int a;
int b;
Edge(int a,int b){
this.a=a;
this.b=b;
}
}
public class Main {
static HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
static int n; //顶点数
static int e; //边数
static Edge[] edge;
static boolean[] flag; //标记是否为非孤立点
static int count=0; //连通分量数
public static void main(String[] args) {
makeGraph();
classify();
System.out.println(count);
}
static void makeGraph() {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
e=sc.nextInt();
edge=new Edge[e];
flag=new boolean[n];
for(int i=0;i<e;i++) {
int a=sc.nextInt();
int b=sc.nextInt();
edge[i]=new Edge(a,b);
flag[a]=true;
flag[b]=true;
}
}
static void classify() {
for(int i=0;i<e;i++) {
if(map.containsKey(edge[i].a)) {
map.put(edge[i].b, map.get(edge[i].a));
}else if(map.containsKey(edge[i].b)) {
map.put(edge[i].a, map.get(edge[i].b));
}else {
count++;
map.put(edge[i].a, count);
map.put(edge[i].b, count);
}
}
for(int i=0;i<n;i++) {
if(!flag[i]) {
count++;
}
}
}
}
相关文章
- Java基础篇(03):流程控制语句,和算法应用
- 《SAP HANA平台应用开发》—第3章3.3节分析视图
- IOS 通过界面图标启动Web应用 + 全屏应用 + 添加到主屏幕
- 【快应用】任意拖动图标实现案例
- 【Harmony OS】【JAVA UI】鸿蒙应用如何集成OKHttp网络三方库
- 如何在快应用中实现标签组件
- Spring应用消费REST服务
- 嵌入式Qt-4.8.6显示中文并且改变字体大小和应用自己制作的字体库
- 《Core Data应用开发实践指南》一3.6 小结
- windows下Oracle Tuxedo编译应用前需要配置的相关环境变量
- ThreadX应用开发笔记之一:移植ThreadX到STM32平台
- Skype for TV停止支持 三星确认今年6月移除该应用
- 最大医学影像平台将首个实现把医疗AI引入实际应用
- ngx_lua实际应用场景介绍
- 数据服务产业链初现,数据应用机会最大