CSP 2017_9_4 通信网络

来源:互联网 发布:室内布置设计软件 编辑:程序博客网 时间:2024/06/06 02:53

题目链接



DFS(AC)

import java.util.ArrayList;import java.util.Scanner;public class Main {static ArrayList<Integer> []adj;static int n, m;static int tol;static boolean []vis;static boolean [][]isLinked;public static void main(String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt(); m = in.nextInt(); adj = new ArrayList[n+1]; vis = new boolean[n+1]; isLinked = new boolean[n+1][n+1]; for(int i = 1; i <= n; i++ ) { adj[i] = new ArrayList<>(); } tol = 0; for(int i = 1; i <= m; i++ ) { int a = in.nextInt(); int b = in.nextInt(); adj[a].add(b); } for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j)//搜索每个点之前 要把vis置false vis[j] = false; dfs(i, i); } int i, j; for(i = 1; i <= n; ++i) { for(j = 1; j <= n; ++j) { if(!isLinked[i][j])//不满足条件 直接退出 break; } if(j == n+1) tol++; } System.out.println(tol); }public static void dfs(int v,int cur) {//核心vis[v] = true;isLinked[v][cur] = isLinked[cur][v] = true; //从cur开始搜的每个点 都是与其相连接的 可以通信for(int w:adj[v]) {//搜索 v的每个临接点if(!vis[w]) {dfs(w,cur);//注意 这里 cur实际上 只是 用于 记录搜索路径上的点 与最初的cur可以通信}}}}


另外 之前用的另一种思路 一直没有AC  先放上 有时间再找找原因

想着是从图的正向 和反向分别DFS 然后 如果 所有的 点 都被访问 说明 该点 可以与所有点通信

但是 不能AC  还没发现问题在哪。。。

package CSP2017_9;import java.util.ArrayList;import java.util.Scanner;public class Main {static ArrayList<Integer> []adj;static ArrayList<Integer> []list;static int n, m;static int tol;static boolean []vis;public static void main(String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt(); m = in.nextInt(); adj = new ArrayList[n+1]; list = new ArrayList[n+1]; vis = new boolean[n+1]; for(int i = 1; i <= n; i++ ) { list[i] = new ArrayList<>(); } for(int i = 1; i <= n; i++ ) { adj[i] = new ArrayList<>(); } tol = 0; for(int i = 1; i <= m; i++ ) { int a = in.nextInt(); int b = in.nextInt(); adj[a].add(b); list[b].add(a); }  for(int i = 1; i <= n; i++ ) { int cnt = 0; dfs(i,adj); dfs(i,list); for(int j = 1; j <= n; j++ ) { if(vis[j]) cnt++; vis[j] = false; } if(cnt == n) { tol++; //System.out.println("point:" + i); } }  System.out.println(tol); }public static void dfs(int cur, ArrayList<Integer> []adj) {vis[cur] = true;for(int w : adj[cur]) {if(!vis[w]) {dfs(w,adj);}}}}