通信网络 ccf 深度优先搜索
2017-11-20 00:00
330 查看
问题描述
某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息。信息可以通过中转的方式进行传递,即如果a能将信息传递到b,b又能将信息传递到c,则a能将信息传递到c。一条信息可能通过多次中转最终到达目的地。
由于保密工作做得很好,并不是所有部门之间都互相知道彼此的存在。只有当两个部门之间可以直接或间接传递信息时,他们才彼此知道对方的存在。部门之间不会把自己知道哪些部门告诉其他部门。
上图中给了一个4个部门的例子,图中的单向边表示通路。部门1可以将消息发送给所有部门,部门4可以接收所有部门的消息,所以部门1和部门4知道所有其他部门的存在。部门2和部门3之间没有任何方式可以发送消息,所以部门2和部门3互相不知道彼此的存在。
现在请问,有多少个部门知道所有N个部门的存在。或者说,有多少个部门所知道的部门数量(包括自己)正好是N。
输入格式
输入的第一行包含两个整数N, M,分别表示部门的数量和单向通路的数量。所有部门从1到N标号。
接下来M行,每行两个整数a, b,表示部门a到部门b有一条单向通路。
输出格式
输出一行,包含一个整数,表示答案。
样例输入
4 4
1 2
1 3
2 4
3 4
样例输出
2
样例说明
部门1和部门4知道所有其他部门的存在。
评测用例规模与约定
对于30%的评测用例,1 ≤ N ≤ 10,1 ≤ M ≤ 20;
对于60%的评测用例,1 ≤ N ≤ 100,1 ≤ M ≤ 1000;
对于100%的评测用例,1 ≤ N ≤ 1000,1 ≤ M ≤ 10000。
想法:
遍历所有节点,如果a可以到达b,则a,b之间可以相互联系,使用一个mp记录
然后遍历所有节点,如果与这个节点有联系的点有n-1个,则为所求节点
代码:
某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息。信息可以通过中转的方式进行传递,即如果a能将信息传递到b,b又能将信息传递到c,则a能将信息传递到c。一条信息可能通过多次中转最终到达目的地。
由于保密工作做得很好,并不是所有部门之间都互相知道彼此的存在。只有当两个部门之间可以直接或间接传递信息时,他们才彼此知道对方的存在。部门之间不会把自己知道哪些部门告诉其他部门。
上图中给了一个4个部门的例子,图中的单向边表示通路。部门1可以将消息发送给所有部门,部门4可以接收所有部门的消息,所以部门1和部门4知道所有其他部门的存在。部门2和部门3之间没有任何方式可以发送消息,所以部门2和部门3互相不知道彼此的存在。
现在请问,有多少个部门知道所有N个部门的存在。或者说,有多少个部门所知道的部门数量(包括自己)正好是N。
输入格式
输入的第一行包含两个整数N, M,分别表示部门的数量和单向通路的数量。所有部门从1到N标号。
接下来M行,每行两个整数a, b,表示部门a到部门b有一条单向通路。
输出格式
输出一行,包含一个整数,表示答案。
样例输入
4 4
1 2
1 3
2 4
3 4
样例输出
2
样例说明
部门1和部门4知道所有其他部门的存在。
评测用例规模与约定
对于30%的评测用例,1 ≤ N ≤ 10,1 ≤ M ≤ 20;
对于60%的评测用例,1 ≤ N ≤ 100,1 ≤ M ≤ 1000;
对于100%的评测用例,1 ≤ N ≤ 1000,1 ≤ M ≤ 10000。
想法:
遍历所有节点,如果a可以到达b,则a,b之间可以相互联系,使用一个mp记录
然后遍历所有节点,如果与这个节点有联系的点有n-1个,则为所求节点
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <vector> #include <map> #define LL long long int const MAX = 1111; int const INF = 1 << 30; double const EPS = 0.00000001; using namespace std; //mp[i][j]==1 表示i可以到达j bool mp[MAX][MAX]; //vis[i]==0表示点未被访问 bool vis[MAX]; int n, m; vector<int> g[MAX]; //由i开始深度优先遍历,st是起始点 void dfs(int i, int st){ vis[i] = 1; for (int j = 0; j < g[i].size(); j++){ int k = g[i][j]; if (vis[k] == 0){ dfs(k, st); mp[st][k] = 1; mp[k][st] = 1; } } } int main(){ freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); scanf("%d %d", &n, &m); for (int i = 0; i < m; i++){ int a, b; scanf("%d %d", &a, &b); g[a].push_back(b); } for (int i = 1; i <= n; i++){ memset(vis, 0, sizeof(vis)); dfs(i, i); } // // for (int i = 1; i <= n; i++){ // for (int j = 1; j <= n; j++){ // printf("%d ", mp[i][j]); // } // printf("\n"); // } int ans = 0; for (int i = 1; i <= n; i++){ int t = 0; for (int j = 1; j <= n; j++){ t += mp[i][j]; } i 7fe0 f (t == n - 1) ans++; } printf("%d\n", ans); return 0; }
相关文章推荐
- 背包问题(深度优先搜索解法)
- 迷宫最短路径 深度优先搜索—C—python
- DFS--深度优先搜索--图的邻接表表示
- 深度优先搜索 ,带环 , 标记颜色
- acm-sdut-深度优先搜索练习之神奇的矩环
- dfs深度优先搜索
- 【PAT 1053】 Path of Equal Weight 深度优先搜索
- leetcode 78. Subsets DFS深度优先搜索
- 深度优先搜索——神奇的矩环
- AOJ 0118 深度优先搜索
- NYOJ1058+NYOJ1282 部分和问题(深度优先搜索DFS入门题)
- nyoj 部分和问题(深度优先搜索DFS)
- 算法——基本的图算法:广度优先搜索、深度优先搜索
- 深度优先搜索
- 深度优先搜索剪枝--xiaozhui
- 深度优先搜索和广度优先搜索的比较与分析
- 记忆化深度优先搜索
- 算法之深度优先搜索和广度优先搜索
- 图搜索之A*算法、深度优先搜索和广度优先搜索
- 人工智能搜索算法(深度优先、迭代加深、一致代价、A*搜索)