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);
			}
		}
	}
	
}
发布了60 篇原创文章 · 获赞 0 · 访问量 2134

猜你喜欢

转载自blog.csdn.net/weixin_43732798/article/details/103481710