题目描述
计算图的连通分支。
输入
第一行顶点数与边数;第二行以后每行是一条边的信息(两个端点的标号,用空格分隔)
输出
连通分支的个数
样例输入
20 18
1 5
5 8
5 9
5 12
5 13
8 10
8 15
9 10
9 15
10 17
14 19
18 19
0 7
6 7
4 11
3 4
2 18
4 6
样例输出
4
代码
import java.util.Scanner;
public class tu {
static boolean[] visited;
static int nv;
static int ne;
static int[][] edge;
/* 图的深度优先递归算法 */
public tu() {
int i, j, ne, k;
System.out.printf("请输入无向图的顶点数和边数,如(6,5)\n");
Scanner sc = new Scanner(System.in);
nv = sc.nextInt();
ne = sc.nextInt();
if (nv < 4) {
System.out.printf("注意顶点数大于4\n");
System.exit(0);
}
edge= new int[nv][nv];
System.out.print("edge.length"+edge.length + "\n");
for (i = 0; i < edge.length; i++)
for (j = 0; j < edge.length; j++) {
edge[i][j] = 0;
}
for (k = 1; k <= ne; k++) {
System.out.printf("");
i = sc.nextInt();
j = sc.nextInt();
edge[i][j] = 1;
edge[j][i] = 1;
}
System.out.println("无向图生成的邻接矩阵:");
for (i = 0; i < edge.length; i++)
for (j = 0; j < edge.length; j++) {
System.out.print(edge[i][j]);
if (j == edge.length - 1)
System.out.print("\n");
}
// 将所有节点标记为未访问
int count = 0;
visited = new boolean[nv];
for (int t = 0; t < nv; t++){
if (visited[t] == false)
{
count++;
dfs(t);
}
}
System.out.println("count"+count);
}
void dfs(int i) {
visited[i] = true; // 访问节点
for (int j = 0; j < nv; j++) { // 遍历边信息列表,进行递归
if (visited[j] == false && edge[i][j] == 1) {
dfs(j);
}
}
}
public static void main(String[] args){
tu tutest=new tu();
}
}