思路:
我不知道标准解法是怎么样的,反正我为我“禁忌的解法”解得100分感到很开心=。=
首先使用list,制作好图的邻接表。
一个是
1→2→3
2→4
3→4
4
一个是
1
2→1
3→1
4→2→3
为什么要分两个邻接表呢,因为一个邻接表不能正确的表示我们要的结果。(自己体悟吧。。。 表1确定发送信号方有哪些全知,表2确定接受信号方有哪些全知)
接下来我们做一个n*n(为去掉0实际n+1 * n+1)的二维数组 vis
vis[i][j] 表示 点i和点j是否可以连通
最终只要j从1到n都为true(都连通) 则部门i全知,ans++
那么下面实际操作:只需要用bfs或者dfs做一下这个vis表就可以了
package csp2017_09_4;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
public class Main{
static List<Integer> list[];
static List<Integer> list2[];
static boolean vis [][] ;
static boolean vn[];
static int n,m;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
list = new ArrayList[n+1];
list2 = new ArrayList[n+1];
for (int i = 0; i < list.length; i++) {
list[i] = new ArrayList<Integer>();
list2[i] = new ArrayList<Integer>();
}
for (int i = 0; i < m; i++) {
int s = sc.nextInt();
int e = sc.nextInt();
list[s].add(e);
list2[e].add(s);
}
vis = new boolean[n+1][n+1];
for (int i = 0; i < vis.length; i++) {
vis[i][i] = true;
}
//bfs
Queue<Integer> q = new LinkedList();
for (int t = 1; t <= n; t++) {
q.add(t);
vn = new boolean[n+1];
while(!q.isEmpty()){
int temp = q.poll();
if(!vn[temp]){
for (int i = 0; i < list[temp].size(); i++) {
int next = list[te