赞
踩
如需转载,请注明出处: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)
具体代码如下:
- public class Main9 {
-
-
- public static void main(String[] args){
- /**
- Scanner scanner=new Scanner(System.in);
- String a=scanner.nextLine();
- String[] strings=a.split(" ");
- int k1=Integer.valueOf(strings[0]);
- int k2=Integer.valueOf(strings[1]);
- int[][] kk=new int[k1+1][k1+1];
- for(int i=0;i<k2;i++){
- String a2=scanner.nextLine();
- String[] strings1=a2.split(" ");
- int n1=Integer.valueOf(strings1[0]);
- int n2=Integer.valueOf(strings1[1]);
- kk[n1][n2]=1;
- }
- **/
- int[][] kk=new int[5][5];
- kk[1][3]=1;
- kk[2][1]=1;
- kk[3][2]=1;
- kk[4][3]=1; //题目给出的数据
-
- int[][] reachable=new int[5][5]; //可达性矩阵
-
- for(int i=1;i<5;i++){ //通过循环,dfs构造每一行数据
- dfs(reachable,kk,i,i);
- }
-
-
- for(int i=1;i<reachable.length;i++){ //打印可达性矩阵
- for(int j=1;j<reachable.length;j++){
- System.out.print(reachable[i][j]);
- }
- System.out.println();
- }
-
- int count =0;
- for(int i=1;i<kk.length;i++){ //计算重要城市的个数
- int out=0;
- for(int d=1;d<kk.length;d++){
- if(reachable[i][d]==1){
- out++;
- }
- }
-
- int in=0;
- for(int j=1;j<kk.length;j++){
- if(reachable[j][i]==1){
- in++;
- }
- }
- if(in>out){
- count++;
- }
- }
- System.out.println(count);
-
- }
-
- /**
- *
- * @param reachable 可达性矩阵
- * @param kk 题目的原始数据
- * @param now 当前行
- * @param x 当前列
- */
- public static void dfs(int[][] reachable,int[][] kk,int now,int x){
-
- for(int i=1;i<reachable.length;i++){ //dfs搜索
- if(kk[x][i]==1&&
- now!=i&&
- reachable[now][i]!=1){
- reachable[now][i]=1;
- dfs(reachable,kk,now,i); //递归
- }
- }
-
- }
- }
如有疑问,欢迎留言~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。