版权声明:本文为博主原创文章,未经博主允许不得转载。 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)