版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}