CCF-CSP 201709-4通信网络
问题描述
某国的军队由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
样例输出
2
样例说明
部门1和部门4知道所有其他部门的存在。
评测用例规模与约定
对于30%的评测用例,1 ≤ N ≤ 10,1 ≤ M ≤ 20;
对于60%的评测用例,1 ≤ N ≤ 100,1 ≤ M ≤ 1000;
对于100%的评测用例,1 ≤ N ≤ 1000,1 ≤ M ≤ 10000。
解题思路:
用一个isconnect二维数组来存储两边是否能够相互到达,能为1,不能为0,然后用dfs遍历所有的点,
首先声明,dfs一定会便利所有的和它互通的点的 是吧!<*-*>
代码如下:
import java.util.Scanner;
public class communication1 {
static int isconnect[][] = new int [1001][1001];
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int result=0;
int n = sc.nextInt();
int m = sc.nextInt();
int a[][] = new int[m][2];
for(int i= 0 ; i < m ; i++){
a[i][0]=sc.nextInt();
a[i][1]=sc.nextInt();
}
for(int v = 1 ;v<=n ; v++){
int book[] = new int [n+1];
dfs(v,a,n,v,book,m);
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
if(isconnect[i][j]==0)
break;
if(j==n) //在矩阵中找到与其他所有点都相连的点
result++;
}
}
System.out.println(result);
}
private static void dfs(int v, int[][] a, int n, int cur, int book[],int m) {
// TODO Auto-generated method stub
isconnect[v][cur]=isconnect[cur][v]=1;
for(int j = 0; j<m ; j++){
if(a[j][0]==cur&&book[a[j][1]]==0){
book[cur]=1; //标记
cur=a[j][1]; //点的移动
isconnect[v][cur]=isconnect[cur][v]=1;
dfs(v,a,n,cur,book,m); //这里可以取消标记也可以不取消标记的
cur=a[j][0]; //回到上一次的出发点
}
}
}
}
但是很遗憾,这样做复杂度太高了,只能拿到60分
解法二:
解题思路:运用邻接表的思想,不了解的可以先了解一下邻接表的基本概念<*-*>,邻接表对于稀疏图还是有优势的,然后同样用dfs遍历。
代码如下:
import java.util.Scanner;
import java.util.ArrayList;
public class communication{
static int [][]isconnect = new int[1024][1024];
@SuppressWarnings("rawtypes")
static ArrayList[]arraylist= new ArrayList[1024];
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int result=0;
int n = sc.nextInt();
int m = sc.nextInt();
for(int i = 1; i<=n ;i++ ){
arraylist[i]=new ArrayList<Integer>();
}
for(int i=0; i<m ; i++){
int s,e;
s=sc.nextInt();
e=sc.nextInt();
arraylist[s].add(e); //该图为有向图,数组下标为起始点,对应集合中的元素为和它相连的终点
}
for(int i = 1;i<=n;i++){ //对每个点作为出发点进行遍历
int[] book = new int [n+1];
dfs(book,i,i,i);
}
for(int i = 1; i<=n ; i++){
int j ;
for(j = 1;j<=n;j++){
if(isconnect[i][j]==0){
break;
}
if(j==n){
result++;
}
}
}
System.out.println(result);
}
public static void dfs(int book[],int cur,int v,int mid){
book[cur]=1;
isconnect[v][cur]=isconnect[cur][v]=1;
for(int i = 0 ; i<arraylist[cur].size() ; i++){
if(book[Integer.parseInt(String.valueOf(arraylist[cur].get(i)))]==0){
mid = cur;
cur=Integer.parseInt(String.valueOf(arraylist[cur].get(i)));
dfs(book,cur,v,mid); //这里没必要要取消标记,因为我们是要
cur=mid;
}
}
}
}
这样就降低了算法复杂度,就拿到100分啦!<*-*>
CCF-CSP 201709-4通信网络的更多相关文章
- CCF CSP 201709-4 通信网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...
- CCF CSP 201403-4 无线网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-4 无线网络 问题描述 目前在一个很大的平面房间里有 n 个无线路由器,每个无线路 ...
- CCF CSP 201503-4 网络延时
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-4 网络延时 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机 ...
- ccf认证 201709-4 通信网络 java实现
试题编号: 201709-4 试题名称: 通信网络 时间限制: 1.0s 内 ...
- csp 通信网络
http://blog.csdn.net/zyy_1998/article/details/78334496 试题编号: 201709-4 试题名称: 通信网络 时间限制: 1.0s 内存限制: 25 ...
- 通信网络 ccf
试题编号: 201709-4 试题名称: 通信网络 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只 ...
- CCF(通信网络):简单DFS+floyd算法
通信网络 201709-4 一看到题目分析了题意之后,我就想到用floyd算法来求解每一对顶点的最短路.如果一个点和任意一个点都有最短路(不为INF),那么这就是符合的一个答案.可是因为题目超时,只能 ...
- 小dai浅谈通信网络(一)——引子
说起通信网络,首先来看一个场景: 场景模式: 小明和小刚在闹市碰面. 小明对小刚大声喊道:"小刚,你好啊!" 小刚摇手答到:"你好,小明!" 就这么几句简单的话 ...
- 浅谈通信网络(三)——TCP/IP协议
简介 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.In ...
- CCF CSP 认证
参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...
随机推荐
- Luogu P1522 牛的旅行 Cow Tours
题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...
- 在 React 中使用 JSX 的好处
优点: 1.允许使用熟悉的语法来定义 HTML 元素树: 2.提供更加语义化且移动的标签: 3.程序结构更容易被直观化: 4.抽象了 React Element 的创建过程: 5.可以随时掌控 HTM ...
- Maven就是这么简单
什么是Maven Maven是一个采用纯Java编写的开源项目管理工具, Maven采用了一种被称之为Project Object Model (POM)概念来管理项目,所有的项目配置信息都被定义在一 ...
- R+NLP︱text2vec包——BOW词袋模型做监督式情感标注案例(二,情感标注)
要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 在之前的开篇提到了text2vec ...
- R语言︱关联规则+时间因素=序贯关联规则
序贯模型=关联规则+时间因素. 了解这个模型可以参考李明老师的<R语言与网站分析 [李明著][机械工业出版社][2014.04][446页]>,第九章,第二节的"序列模型关联分析 ...
- DML触发器1
数据库触发器是特殊的存储程序.通常不直接调用它们,而是由数据库的事件触发. 触发器分类: >DML触发器 >instead-of触发器 >系统事件触发器,还可以是DDL 一. DML ...
- am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试
StarterWare在AM335X上的烧录运行 步骤:1.下载安装StarterWare,我们团购的SK需要02.00.00.07版本.最近外网访问慢,我上传到论坛.2.找一张miniSD卡,不需要 ...
- Netty的并发编程实践1:正确使用锁
很多刚接触多线程编程的开发者,虽然意识到了并发访问可变变量需要加锁,但是对于锁的范围.加锁的时机和锁的协同缺乏认识,往往会导致出现一些问题.下面笔者就结合Netty的代码来讲解下这方面的知识. 打开F ...
- Django学习-1-管理我的django程序
网页中文文档 http://python.usyiyi.cn/documents/django_182/topics/db/models.html Django性能测试工具 https://githu ...
- 堡垒机-teleport的安装以及常见问题解决办法
teleport是一款简单易用的堡垒机系统,运用在企业对windows.linux服务器的安全使用管理以及审计. 官网网址:http://teleport.eomsoft.net/ github地址: ...