欢迎访问我的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);
}
}
}
}