JAVA CCF-201709-4 通信网络

欢迎访问我的CCF认证解题目录


题目描述

在这里插入图片描述


思路过程

A点能访问B点,那么AB点就互相知道对方的存在,我们可以对每一个点进行一次DFS,定义一个二维的boolean数组对访问到的点进行相互标记,最后统计有多少个点能访问n个点(包括自己)


代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	
	static ArrayList<ArrayList<Integer>> graph;//图
	static boolean[][] flag2;//标记点的访问情况
	static boolean[] flag;//标记
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt(), m = in.nextInt();
		graph = new ArrayList<ArrayList<Integer>>();
		flag2 = new boolean[n+1][n+1];
		flag = new boolean[n+1];
		for ( int i = 0; i <= n; i++ ) {
			graph.add(new ArrayList<Integer>());
		}
		while ( m-- != 0 ) graph.get(in.nextInt()).add(in.nextInt());
		for ( int i = 1; i <= n; i++ ) {
			DFS(i,i);
			flag2[i][i] = true;//自己能访问自己
			Arrays.fill(flag, false);//复位
		}
		int cnt = 0;//计数
		for ( int i = 1; i <= n; i++ ) {
			boolean f = true;
			for ( int j = 1; j <= n; j++ ) {
				if ( !flag2[i][j] ) {//如果遇到不能访问的
					f = false;
					break;
				}
			}
			if ( f ) cnt++;
		}
		System.out.println(cnt);
	}
	
	//st是当前进行的点,index是正常dfs
	public static void DFS( int st, int index ) {
		flag[index] = true;
		for ( int next: graph.get(index) ) {
			flag2[st][next] = true;//互相标记
			flag2[next][st] = true;
			if ( !flag[next] ) {
				DFS(st, next);
			}
		}
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值