当前位置:   article > 正文

腾讯秋招web后台方向笔试题第二题,寻找重要城市,dfs解法。_dfs应用-计算可达城市对

dfs应用-计算可达城市对

如需转载,请注明出处:https://blog.csdn.net/qq_34761108/article/details/82728430

问题描述:

      小Q所在的王国有n个城市,城市之间有m条单向道路连接起来。对于一个城市v,从城市v出发可到达的城市数量为x,从某个城市出发可达到的城市v的城市数量为y,如果y>x,则城市v是一个重要城市(间接可达也算可以到达)。

      小Q希望你能帮他计算一下王国中一共有多少个重要城市。

     输入描述:

             输入包括 m+1行

             第一行包括两个数n和m(1<=n,m<=1000),分别表示城市数和道路数。

             接下来m行,每行两个树u,v(1<=u,v<=n),表示一条从u到v的有向道路输入中可能包含重边和自环

      输出秒速:

             输出一个数,重要城市的个数。

       例子:

         输入:

              4 3

              2 1

              3 2

              4 3

         输出:

               2

        思路:

                  

         如题,城市一可达的城市有0个,可达城市一的城市有3个(城市2,城市3,城市4)

                    城市二可达的城市有1个,可达城市二的城市有2个(城市3,城市4)

                    城市三可达的城市有2个,可达城市三的城市有1个。

                    城市四可达的城市有3个,可达城市四的城市有0个。

                 因此最终的答案是2.

          因此我先维护一个二维的数组,来存储输入的数据:(注意,我这里加入了城市一到城市三的路径)

                      

                        

             X表示不可达,O表示可达。

          根据题意,我们还应该再维护一个可达矩阵,因为题目给出的条件是间接可达也算是可达。

                     

          X表示不可达,O表示可达。           

          有了这个矩阵,我们可以清楚的知道,城市x可到达哪些城市。

             比如我们想知道城市一可达哪些城市,只要看第一行就可知道城市一可达两个城市,分别是城市2和城市3。想知道哪些城市可达城市一,只要看第一列,即城市2,城市3,城市4均可达城市一。

           因此,只要我们能够生成这个数列,就可以解出此题。

           为了够造这个矩阵,我采用的是深度优先算法(dfs)

           具体代码如下:

                  

  1. public class Main9 {
  2. public static void main(String[] args){
  3. /**
  4. Scanner scanner=new Scanner(System.in);
  5. String a=scanner.nextLine();
  6. String[] strings=a.split(" ");
  7. int k1=Integer.valueOf(strings[0]);
  8. int k2=Integer.valueOf(strings[1]);
  9. int[][] kk=new int[k1+1][k1+1];
  10. for(int i=0;i<k2;i++){
  11. String a2=scanner.nextLine();
  12. String[] strings1=a2.split(" ");
  13. int n1=Integer.valueOf(strings1[0]);
  14. int n2=Integer.valueOf(strings1[1]);
  15. kk[n1][n2]=1;
  16. }
  17. **/
  18. int[][] kk=new int[5][5];
  19. kk[1][3]=1;
  20. kk[2][1]=1;
  21. kk[3][2]=1;
  22. kk[4][3]=1; //题目给出的数据
  23. int[][] reachable=new int[5][5]; //可达性矩阵
  24. for(int i=1;i<5;i++){ //通过循环,dfs构造每一行数据
  25. dfs(reachable,kk,i,i);
  26. }
  27. for(int i=1;i<reachable.length;i++){ //打印可达性矩阵
  28. for(int j=1;j<reachable.length;j++){
  29. System.out.print(reachable[i][j]);
  30. }
  31. System.out.println();
  32. }
  33. int count =0;
  34. for(int i=1;i<kk.length;i++){ //计算重要城市的个数
  35. int out=0;
  36. for(int d=1;d<kk.length;d++){
  37. if(reachable[i][d]==1){
  38. out++;
  39. }
  40. }
  41. int in=0;
  42. for(int j=1;j<kk.length;j++){
  43. if(reachable[j][i]==1){
  44. in++;
  45. }
  46. }
  47. if(in>out){
  48. count++;
  49. }
  50. }
  51. System.out.println(count);
  52. }
  53. /**
  54. *
  55. * @param reachable 可达性矩阵
  56. * @param kk 题目的原始数据
  57. * @param now 当前行
  58. * @param x 当前列
  59. */
  60. public static void dfs(int[][] reachable,int[][] kk,int now,int x){
  61. for(int i=1;i<reachable.length;i++){ //dfs搜索
  62. if(kk[x][i]==1&&
  63. now!=i&&
  64. reachable[now][i]!=1){
  65. reachable[now][i]=1;
  66. dfs(reachable,kk,now,i); //递归
  67. }
  68. }
  69. }
  70. }

如有疑问,欢迎留言~

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/570373
推荐阅读
相关标签
  

闽ICP备14008679号