java之求图的连通分支

题目描述
计算图的连通分支。
在这里插入图片描述
输入
第一行顶点数与边数;第二行以后每行是一条边的信息(两个端点的标号,用空格分隔)

输出
连通分支的个数

样例输入
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();
	}
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

callmeCassie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值