CCF 201709-4 通信网络

解题思路

  • 题目要求图中各点是否有直接或间接的关系,即两点之中,是否有一点能够到达另一点。要求与所有点有关系的点的个数。
  • 显然这是一道搜索题,由于题目数据量并不大,所以我们可以直接DFS深搜,记录下所搜过程中点与点的关系。最后再判断每一点是否跟所有点都有关系。
#include
#include
#include
#include
#include
using namespace std;

const int maxn=1000+10;
const int maxm=10000+10;
int n,m;
vector<int> G[maxm];
int vis[maxn];
int connect[maxn][maxn]={0};
int ans=0;

void dfs(int c,int u){
	connect[c][u]=1;
	connect[u][c]=1;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(vis[v]) continue;
		vis[u]=1;
		dfs(c,v);
	}
}

int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d %d",&u,&v);
		G[u].push_back(v);
	}
	for(int i=1;i<=n;i++){
		memset(vis,0,sizeof(vis));
		vis[i]=1;
		dfs(i,i);
	}
	for(int i=1;i<=n;i++){
		int k=0;
		for(int j=1;j<=n;j++){
			if(connect[i][j]==1) k++;
			else break;
		}
		if(k==n) ans++;
	}
	printf("%d",ans);
	return 0;
}

你可能感兴趣的:(DFS搜索,CCF,CSP历年真题)