问题描述

  某国的军队由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通信网络的更多相关文章

  1. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

  2. CCF CSP 201403-4 无线网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-4 无线网络 问题描述 目前在一个很大的平面房间里有 n 个无线路由器,每个无线路 ...

  3. CCF CSP 201503-4 网络延时

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-4 网络延时 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机 ...

  4. ccf认证 201709-4 通信网络 java实现

    试题编号:                                                               201709-4 试题名称: 通信网络 时间限制: 1.0s 内 ...

  5. csp 通信网络

    http://blog.csdn.net/zyy_1998/article/details/78334496 试题编号: 201709-4 试题名称: 通信网络 时间限制: 1.0s 内存限制: 25 ...

  6. 通信网络 ccf

    试题编号: 201709-4 试题名称: 通信网络 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只 ...

  7. CCF(通信网络):简单DFS+floyd算法

    通信网络 201709-4 一看到题目分析了题意之后,我就想到用floyd算法来求解每一对顶点的最短路.如果一个点和任意一个点都有最短路(不为INF),那么这就是符合的一个答案.可是因为题目超时,只能 ...

  8. 小dai浅谈通信网络(一)——引子

    说起通信网络,首先来看一个场景: 场景模式: 小明和小刚在闹市碰面. 小明对小刚大声喊道:"小刚,你好啊!" 小刚摇手答到:"你好,小明!" 就这么几句简单的话 ...

  9. 浅谈通信网络(三)——TCP/IP协议

    简介 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.In ...

  10. CCF CSP 认证

    参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...

随机推荐

  1. JSP的内置对象以及作用域。

    最近在面试,一些基础的问题总是会被问到,虽然是基础,但是有些东西在工作中用的少,所以就有些记不清了,在面试的时候更因为紧张很容易造成原先知道的知识也会突然忘了的情况发生.所以在重新组织一下jsp的内置 ...

  2. 使用TensorFlow的卷积神经网络识别自己的单个手写数字,填坑总结

    折腾了几天,爬了大大小小若干的坑,特记录如下.代码在最后面. 环境: Python3.6.4 + TensorFlow 1.5.1 + Win7 64位 + I5 3570 CPU 方法: 先用MNI ...

  3. 0_OpenCV3.4.0+Visual Studio2017 + win10环境配置

    研究生学习方向是计算机视觉,因此想从传统的算法开始,于是尝试安装Opencv做一些项目.在安装过程中碰到很多问题,搭建成功后立刻记录下来,一遍以后查看. 安装环境:windows10 64bit 专业 ...

  4. 航空客户价值分析特色LRFMC模型——RFM升级

    本文转载自微信公众号TIpDM. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 我们说RFM ...

  5. Excel 2010高级应用-雷达图(六)

    Excel 2010高级应用-雷达图(六) 基本操作如下: 1.新建空白Excel文档,并命名雷达图 2.单击"插入",并找到雷达图图样 3.单击雷达图图样,在空白文档上生成图框, ...

  6. Netty高可靠性设计:优化建议

    尽管Netty的可靠性已经做得非常出色,但是在生产实践中还是发现了一些待优化点,本小节将进行简单说明.希望后续的版本中可以解决,当然用户也可以根据自己的实际需要决定自行优化. 1  发送队列容量上限控 ...

  7. java字符串替换的问题

    今天工作中遇到一个问题,需要输出mongodbObject中的部分内容,当我转换成字符串以后出现了好像无法替换的问题,经过验证,发现并非是不能替换,只是想法错误而已. package demo; /* ...

  8. 决策树系列(五)——CART

    CART,又名分类回归树,是在ID3的基础上进行优化的决策树,学习CART记住以下几个关键点: (1)CART既能是分类树,又能是分类树: (2)当CART是分类树时,采用GINI值作为节点分裂的依据 ...

  9. JAVA IDE IntelliJ IDEA 快捷键使用详记

    一.高效定位代码 1.项目之间的跳转 Ctrl + Alt + [  :切换到下一个项目窗口 Ctrl + Alt + ]  :  切换到上一个项目窗口 2.文件之间的跳转↑↓←→ Ctrl + E ...

  10. 【BZOJ2959】长跑(Link-Cut Tree,并查集)

    [BZOJ2959]长跑(Link-Cut Tree,并查集) 题面 BZOJ 题解 如果保证不出现环的话 妥妥的\(LCT\)傻逼题 现在可能会出现环 环有什么影响? 那就可以沿着环把所有点全部走一 ...