CCF-201709-4-通訊網路
阿新 • • 發佈:2019-01-13
這道題爆搜,每個結點作為起點開始搜,每搜到一個,就標記一個。用一個鄰接矩陣knows來標記得到聯絡的點。比如從點1開始搜,搜到4,那就 knows[1][4] = knows[4][1] = 1。
結點數不多,所以可以爆搜,但是沒想到同樣的思路java可以100,python就只有75,真的玄學。。。平時用python做題,記憶體,執行時間都比java好的。
201818/12/19:
這次用python考,看到所有題目的時間限制都在10s內,所以不用擔心,只管想好思路。不過也不能用暴力,這個很冒險的。這次第四題套prim模板做100了,如果限制1s我覺得只有50分而已。
Java程式碼(100)
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); int m = input.nextInt(); ArrayList<Integer>[] graph = new ArrayList[n]; int[][] knows = new int[n][n]; for (int i = 0; i < n; i++) graph[i] = new ArrayList(); //建立鄰接表 for (int i = 0; i < m; i++) { int a = input.nextInt() - 1; int b = input.nextInt() - 1; graph[a].add(b); } //每個結點都進行一次dfs for (int i = 0; i < n; i++) { dfs(i, i, graph, knows, new boolean[n]); } int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (knows[i][j] == 0) break; if (j == n - 1) count++; } } System.out.println(count); } public static void dfs(int start, int cur, ArrayList<Integer>[] graph, int[][] knows, boolean[] vis) { knows[start][cur] = 1; knows[cur][start] = 1; vis[cur] = true; for (int i = 0; i < graph[cur].size(); i++) { int nextNode = graph[cur].get(i); if (!vis[nextNode]) dfs(start, nextNode, graph, knows, vis); } } }
python程式碼(75)
import sys sys.setrecursionlimit(1050) def dfs(start, cur, graph, knows, vis): knows[start][cur] = 1 knows[cur][start] = 1 vis[cur] = True for node in graph[cur]: if not vis[node]: dfs(start, node, graph, knows, vis) n, m = map(int, input().split()) graph = [[] for _ in range(n)] for i in range(m): a, b = map(int, input().split()) a -= 1 b -= 1 graph[a].append(b) # 每個部門所知道的已存在部門 knows = [[0] * n for _ in range(n)] for i in range(n): dfs(i, i, graph, knows, [False for _ in range(n)]) count = 0 for k in knows: for e in k: if e == 0: break else: count += 1 print(count)