【CCF历年题题解】201709-4 通信网络【图的遍历DFS】

链接地址

定义r[u][v] 表示 u -> v,在DFS中标识即可,这是一个双向的。dfs(u, e[v][i]) // u不变,v变!

#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e3+24;
int n, m, ans = 0;
bool r[maxn][maxn], vis[maxn];
vector <int> e[maxn];
 
void read()
{
    
    
    cin >> n >> m;
    for(int i = 0; i < m; ++i)
    {
    
    
        int u, v;
        cin >> u >> v;
        e[u].push_back(v);
    }
}
 
void dfs(int u, int v) //u为当前查找的点,v为直接或间接与u相连通的点
{
    
    
    r[u][v] = true; //u可以访问到v
    r[v][u] = true; //v可以访问到u
    vis[v] = true;
 
    for(int i = 0; i < e[v].size(); ++i)
        if(!vis[e[v][i]])
            dfs(u, e[v][i]);
}
 
void solve()
{
    
    
    for(int i = 1; i <= n; ++i)
    {
    
    
        memset(vis, 0, sizeof(vis));
        dfs(i, i); //搜索每个点,从自身开始查找
    }
 
    for(int i = 1; i <= n; ++i)
    {
    
    
        int cnt = 0;
        for(int j = 1; j <= n; ++j)
            if(r[i][j])
                cnt++;
        if(cnt == n)
            ans++;
    }
    cout << ans;
}
 
int main()
{
    
    
    read();
    solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43154149/article/details/108548270