ccf认证 201709-4 通信网络 java实现
试题编号: | 201709-4 |
试题名称: | 通信网络 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述
某国的军队由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。 |
这是一道深度优先搜索的图论。。
把它理解成:
输入一个图,我们判断一下 有几个节点能到其他所有节点和 有几个节点能被其他所有节点访问到。
题目中说是单项图,但是问题是 能访问所有节点和能被所有节点访问都算数,所以和双向图也没有区别,
把它理解成 图中哪些节点与其他所有节点有通路就可以了。
需要用到深度优先遍历的思想,具体这样实现:
有n个点 m条路
1 建立一个邻接表:n长度的数组line,数组里每个位置存一张链表, line[i] 的链表里存着 所有能从i点出发到达的节点的编号。
2 建立一个n*n二维表graph 代表整个图,,我们要对 邻接表line进行深度优先遍历,
在line中 root从1到n 依次拿i当做根节点编号root, 拿到line[root] 链表,
在链表里所有的节点i都能从root出发到达,我们就在graph[root][i]和graph[i][root]标记为1 表明他们连同
同时i节点能到达的节点,root也能间接到达,所以 我们再对line[i] 列表里所有的节点标号进行在graph上标记连通。
为了防止图中出现循环通路的情况,我用用一个visited表进行标记 同一个root出发进行深度遍历的时候,访问到某个节点i 就把visited[i] 设为1 表示访问过了,跳过访问
这里我们要深度优先,所以 要在循环里面递归。
最后我们再graph上进行统计 某一行所有数据都是1 那么说明他和所有点都能连通。
java代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; public class Main{
public Scanner fin; // 标准输入
public int n,m; // 点的个数和路径的个数
public int visited[]; // 标记每次深度搜索是否遍历过目标节点 方式无限递归
public List<Integer>[] line; // 第i个列表存i能到达的所有节点编号
public int[][] graph; // 二维表i j 标记i和j之间有通路
public int root; // 记录每次遍历的根节点
public int count=0; // 最终结果哦 public static void main(String[] args) {
new Main().run();
}
public void run() {
init();
// 输入每条路
for(int i=1;i<=m;i++) {
int a = fin.nextInt();
int b = fin.nextInt();
line[a].add(b); // a节点能到达b节点
}
// 对每一个节点 进行深度优先遍历,更新二维表graph 将i 和j 两个节点之间有路的 二维表相应位置设为1
for(int i=1;i<=n;i++) {
// 对每次从根节点遍历子节点进行初始化visited数组
visited = new int[n+1];
root = i;
dfs(i);
}
// 统计能够知道所有其他节点的节点个数
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(graph[i][j]==0) {
break;
}
if(j==n) {
count ++;
}
}
}
System.out.println(count); }
public void dfs(int cur) {
// 根节点和当前子节点能够通路
graph[root][cur] = 1;
graph[cur][root] = 1;
visited[cur] = 1;
// 对cur节点能到达的节点列表遍历
for(int i=0;i<line[cur].size();i++) {
if(visited[line[cur].get(i)]==0) { // 如果当前子节点还没有被访问过
dfs(line[cur].get(i));
}
}
} public void init() {
fin = new Scanner(System.in);
n = fin.nextInt();
m = fin.nextInt();
visited = new int[n+1];
line = new List[n+1];
for(int i=1;i<=n;i++) {
line[i] = new ArrayList<>();
}
graph = new int[n+1][n+1]; } }
ccf认证 201709-4 通信网络 java实现的更多相关文章
- CCF认证201803-2 碰撞的小球 java代码实现。
问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒. 当小球到达线 ...
- CCF CSP 201709-4 通信网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...
- 上机题目(0基础)- Java网络操作-Socket实现client和server端通信(Java)
非常多刚開始学习的人对于java网络通信不太熟悉.对相关概念也不太明确,这里我们主要实现一下socket通信,socket通信在java中应用十分广泛.比如QQ和MSN等都是基于socket通信的,什 ...
- 通信网络 ccf
试题编号: 201709-4 试题名称: 通信网络 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只 ...
- CCF(通信网络):简单DFS+floyd算法
通信网络 201709-4 一看到题目分析了题意之后,我就想到用floyd算法来求解每一对顶点的最短路.如果一个点和任意一个点都有最短路(不为INF),那么这就是符合的一个答案.可是因为题目超时,只能 ...
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- CCF认证历年试题
CCF认证历年试题 不加索引整理会死星人orz 第一题: CCF201712-1 最小差值(100分) CCF201709-1 打酱油(100分) CCF201703-1 分蛋糕(100分) CCF2 ...
- UDP局域网通信的Java实现及Android平台尝试
局域网通信已经很少被他人所提及了,我曾经还尝试过通过蓝牙构建通信网络,这次有机会尝试UDP局域网通信,在这里把一些基本过程和在Android平台上的问题记录一下. 1. UDP基础知识 1.1 什么是 ...
- android的Binder通信机制java层浅谈-android学习之旅(88)
1.Service Manager的Java代理对象 在Java层中,Service Manager的代理对象类型为ServiceManagerProxy.它继承并且实现了IServiceManage ...
随机推荐
- python全栈开发-Day4 列表
python全栈开发-Day4 列表 一.首先按照以下几个点展开列表的学习 #一:基本使用 1 用途 2 定义方式 3 常用操作+内置的方法 #二:该类型总结 1 存一个值or存多个值 只能存一个值 ...
- 设计模式——适配器模式(C++实现)
#include <iostream> #include <string> using namespace std; class STTarget { publ ...
- Vue2.0+Node.js+MongoDB全栈打造商城系统 免费下载
<ignore_js_op> 课程目录||--第01章 课程介绍| 01-01 课程-导学.mp4| 01-02 前端框架回顾.mp4| 01-03 vue概况以及核心思 ...
- linux的学习之路--(五)bash及其特性
操作系统组成作用shell是离用户最近的程序 shell:外壳 两类 GUI:Gnome,KDE,Xfce CLI:sh, csh,ksh,bash(都是程序,就是功能支持的不同而已) 进程:在每个进 ...
- 关于 Touchjs 手势识别事件库 this 关键字与选择器不对称情况
Touchjs 版本 v0.2.14 废话不多,直接看代码,一个拖动实例 <div id="touch-drag"></div> <script ty ...
- jQuery 3.0最终版发布,十大新特性眼前一亮
jQuery 3.0在日前发布了最终的全新版本.从2014年10月,jQuery团队对这个主要大版本进行维护开始,web开发者社区便一直在期待着这一刻的到来,终于在2016年6月他们迎来了这一个最终板 ...
- 前端dom元素的操作优化建议
参考自:http://blog.csdn.net/xuexiaodong009/article/details/51810252 其实在web开发中,单纯因为js导致性能问题的很少,主要都是因为DOM ...
- Mycat 分片规则详解--范围取模分片
实现方式:该算法先进行范围分片,计算出分片组,组内在取模 优点:综合了范围分片和取模分片的优点,分片组内使用取模可以保证组内的数据分布比较均匀,分片组之间采用范围分片可以兼顾范围分片的特点,事先规划好 ...
- Angular开发实践(五):深入解析变化监测
什么是变化监测 在使用 Angular 进行开发中,我们常用到 Angular 中的绑定--模型到视图的输入绑定.视图到模型的输出绑定以及视图与模型的双向绑定.而这些绑定的值之所以能在视图与模型之间保 ...
- 设计模式 --> (13)备忘录模式
备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态 示例 玩游戏时都会保存进度,所保存的进度以文件的形式存在.这样下次就可 ...