输入
第一行有两个整数n,m
n表示有n个点;m表示接下来有m行数据
接下来m行,每行都有两个整数a,b,表示a,b之间有路径
输出
输出无向图中的连通分量的个数
代码
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
static int n;
static int m;
static LinkedList adj[];//邻接链表
static Scanner cin = new Scanner(System.in);
public static void main(String[] args) {
n=cin.nextInt();
m=cin.nextInt();
Graph G=new Graph();//邻接链表表示的无向图
CC cc=new CC(G);//求无向图中的连通分量
System.out.println(cc.getCount());
cin.close();
}
private static class Graph {
int V;//点数
int E;//边数
public Graph(){
this.V=n;
this.E=m;
adj=new LinkedList[V+1];
//表示无向图中的点从1开始到V
for(int i=1;i<V+1;i++){
adj[i]=new LinkedList<>();
}
for(int i=0;i<E;i++){
int a=cin.nextInt();
int b=cin.nextInt();
addEdge(a,b);
}
}
private void addEdge(int a, int b) {
adj[a].add(b);
adj[b].add(a);
}
public int getV() {
return V;
}
public Iterable<Integer> adj(int v){
return adj[v];
}
}
private static class CC {
private boolean marked[];
private int []id;
private int count;
public CC(Graph G) {
marked=new boolean[G.getV()+1];//默认数组值全为false
id=new int[G.getV()+1];//默认全为0
for(int i=1;i<G.getV()+1;i++){
if(!marked[i]){
dfs(G,i);
count++;
}
}
}
private void dfs(Graph G, int i) {
marked[i]=true;
id[i]=count;
for(int k:G.adj(i)){
if(!marked[k]){
dfs(G,k);
}
}
}
public int getCount() {
return count;
}
}
}