1. 程式人生 > >CCF-201709-4-通訊網路

CCF-201709-4-通訊網路

這道題爆搜,每個結點作為起點開始搜,每搜到一個,就標記一個。用一個鄰接矩陣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)