CCF 201709-4 通信网络(模拟,DFS)

题意:给一张图,求有几个结点能知道所有的结点

思路:n只有1000,按题意用DFS跑图,再暴力统计答案

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #define LL long long
 6 #define debug(x) cout << "[" << x << "]" << endl
 7 using namespace std;
 8 
 9 const int mx = 1010;
10 struct edge{
11     int v, nxt;
12 }e[mx*10];
13 int head[mx], tot = 1;
14 int d[mx][mx];
15 bool vis[mx];
16 
17 void add(int u, int v){
18     e[tot].v = v;
19     e[tot].nxt = head[u];
20     head[u] = tot++;
21 }
22 
23 void dfs(int u, int f){
24     d[u][f] = d[f][u] = 1;
25     vis[u] = 1;
26     for (int i = head[u]; i; i = e[i].nxt){
27         int v = e[i].v;
28         if (vis[v]) continue;
29         dfs(v, f);
30     }
31 }
32 
33 int main(){
34     int n, m;
35     scanf("%d%d", &n, &m);
36     while (m--){
37         int u, v;
38         scanf("%d%d", &u, &v);
39         add(u, v);
40     }
41     for (int i = 1; i <= n; i++){
42         memset(vis, 0, sizeof vis);
43         dfs(i, i);
44     }
45     int ans = 0;
46     for (int i = 1; i <= n; i++){
47         bool ok = 1;
48         for (int j = 1; j <= n; j++){
49             if (!d[i][j]){
50                 ok = 0;
51                 break;
52             }
53         }
54         if (ok) ans++;
55     }
56     printf("%d\n", ans);
57     return 0;
58 }

猜你喜欢

转载自www.cnblogs.com/QAQorz/p/9651203.html