CCF-201709-4-通信网络

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/AivenZhong/article/details/84720957

这道题爆搜,每个结点作为起点开始搜,每搜到一个,就标记一个。用一个邻接矩阵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)

猜你喜欢

转载自blog.csdn.net/AivenZhong/article/details/84720957