您的位置:首页 > 理论基础 > 计算机网络

ccf 201709-4 通信网络 java 100分

2018-03-13 13:52 441 查看
问题描述 
  某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息。信息可以通过中转的方式进行传递,即如果a能将信息传递到b,b又能将信息传递到c,则a能将信息传递到c。一条信息可能通过多次中转最终到达目的地。 
  由于保密工作做得很好,并不是所有部门之间都互相知道彼此的存在。只有当两个部门之间可以直接或间接传递信息时,他们才彼此知道对方的存在。部门之间不会把自己知道哪些部门告诉其他部门。 


 
  上图中给了一个4个部门的例子,图中的单向边表示通路。部门1可以将消息发送给所有部门,部门4可以接收所有部门的消息,所以部门1和部门4知道所有其他部门的存在。部门2和部门3之间没有任何方式可以发送消息,所以部门2和部门3互相不知道彼此的存在。 
  现在请问,有多少个部门知道所有N个部门的存在。或者说,有多少个部门所知道的部门数量(包括自己)正好是N。 
输入格式 
  输入的第一行包含两个整数N, M,分别表示部门的数量和单向通路的数量。所有部门从1到N标号。 
  接下来M行,每行两个整数a, b,表示部门a到部门b有一条单向通路。 
输出格式 
  输出一行,包含一个整数,表示答案。 
样例输入 
4 4 
1 2 
1 3 
2 4 
3 4 
样例输出 

样例说明 
  部门1和部门4知道所有其他部门的存在。 
评测用例规模与约定 
  对于30%的评测用例,1 ≤ N ≤ 10,1 ≤ M ≤ 20; 
  对于60%的评测用例,1 ≤ N ≤ 100,1 ≤ M ≤ 1000; 
  对于100%的评测用例,1 ≤ N ≤ 1000,1 ≤ M ≤ 10000。
import java.util.ArrayList;
import java.util.Scanner;

/**
* Created by Administrator on 3/12,0012.
* 201709-4通信网络
*/
public class Main {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n =scanner.nextInt();
//int[][] graph = new int

;
ArrayList<Integer>[] graph = new ArrayList
;//用int数组会超时,只能得60分
for (int i = 0; i < n; i++) {
graph[i] = new ArrayList<Integer>();
}
boolean[][] isConnected = new boolean

;

int m = scanner.nextInt();
for (int i = 0; i < m; i++) {
int vexi = scanner.nextInt();
int vexj = scanner.nextInt();
//graph[vexi-1][vexj-1] = 1;
graph[vexi-1].add(vexj-1);
}

int count = 0;
for (int i = 0; i < n; i++) {//初始化 isConnected

dfs(graph,i,isConnected[i]);

}
int i,j;
for (i = 0; i <n ; i++) {
for ( j = 0; j < n; j++) {
if (isConnected[i][j]==false && isConnected[j][i]==false ){
break;
}
}
if (j==n){
count++;
}
}

System.out.println(count);

}

/*    private static void   dfs(int[][] graph, int i, boolean[] visited) {
visited[i] = true;
for (int j = 0; j < visited.length; j++) {
if ( visited[j] ==false && graph[i][j]==1 ){

dfs(graph,j,visited);

}
}

}*/
private static void   dfs(ArrayList<Integer>[] graph, int i, boolean[] visited) {
visited[i] = true;
for (int j = 0; j < graph[i].size(); j++) {
int next = graph[i].get(j);
if ( visited[next] ==false  ){

dfs(graph,next,visited);

}
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: