201709-4 通信网络(dfs的灵活运用)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36172505/article/details/82620400

题目链接:
通信网络

题目大意:
中文题,不解释!!!

解题思路:
利用dfs从i节点出发,深度遍历与其相连节点,遍历过程中,经过的节点就和i建立一条边。最后看看该节点是否和其余的节点都建立了边的关系,是的话,答案+1

其实这个我们可以想象成,水流,dfs过程中,把源头带进去dfs,每经过一个节点,就让他和源头建立边,这样我们就知道我们的水可以流去哪些地方了,很巧妙的做法!!!

这又让我想起了,当时在考场的我直接正反向dfs,结果只有25分,呜呜呜!!!
惨不忍睹。说多了都是泪,这次好好加油!!!

AC代码:

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

int map[1010][1010],vis[1010];
vector<int> g[1010];
int n,m;

void dfs(int u,int v){
    vis[u] = 1;
    map[u][v] = 1;
    map[v][u] = 1;

    for(int i=0; i<g[u].size(); ++i){
        if(!vis[g[u][i]]){
            dfs(g[u][i],v);
        }
    }
}

int main(){
    memset(g, 0, sizeof(g));
    cin>>n>>m;
    for(int i=0; i<m; ++i){
        int a,b;
        cin>>a>>b;
        g[a].push_back(b);
    }

    for(int i=1; i<=n; ++i){
        memset(vis, 0, sizeof(vis));
        dfs(i,i);
    }

    int cnt=0;

    for(int i=1; i<=n; ++i){
        int j;
        for(j=1; j<=n; ++j){
            if(map[i][j]==0) break;
        }
        if(j==n+1) cnt++;
    }
    cout<<cnt<<endl;
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_36172505/article/details/82620400