[解答]CCF-通信网络-2017

来源:互联网 发布:mac存储图片快捷键 编辑:程序博客网 时间:2024/06/03 08:22

CFF-通信网络-2017
一个朋友问的题目,在这做一下笔记

算法思路:
1.对每一个点都进行一次深搜遍历,看是否能把所有的点都到达一遍
2.用visited去标记每一次的深搜过程中走过的点,避免重复走(有可能进入死循环)
3.用map作为通路记录(当然也可以用vector<vector<int>> 来记录每一起始点的所有能到达的点)
4.ans表示能遍历全部点的点的数量。
5.know[i][j] 表示的是i知道j
6.THIS表示是,当前用于深搜的点的起始点编号。(因为,题目说了知道能相互通信(无论是间接还是直接的)就可以知道彼此)

#include <iostream>#include <cstring>using namespace std;bool map[1024][1024];bool know[1024][1024];bool visited[1024]; int ans, n, THIS;void dfs(int now) {    if (visited[now]) {        return;    }    know[THIS][now] = know[now][THIS] = visited[now] = true;    for (int i = 1; i <= n; ++i) {        if (!visited[i] && map[now][i]){            dfs(i);        }    }}int main(){    int m, b, e;    cin >> n>> m;    memset(map, false,sizeof(map));    memset(know, false,sizeof(know));    for(int i = 0; i < m; ++i){        cin >> b>> e;        map[b][e] = true;    }    ans = 0;    for (int i = 1; i <= n; ++i) {        memset(visited, false, sizeof(visited));        THIS = i;        dfs(i);    }    bool is;    for (int i = 1; i <= n; ++i) {        is = true;        for (int j = 1;j <= n && is; ++j) {            is = is && know[i][j];        }        if (is)            ans++;    }    cout << ans;}

最后,给我的公众号拉一波关注!
本人中大一肥宅,欢迎大家关注,请扫下面的二维码


二维码

如果有什么疑问,也可以直接在公众号后台询问。
您的问题,很有可能会被像这样给出解答

原创粉丝点击