CCF CSP 201709-4 通信网络

思路:

1.正着存一个图,再把边的方向倒过来再存一个图;
2.对于每个点,dfs正着的那个图,再dfs倒着的那个图,分别设立两个数组标记每个点是否被访问,如果有点两次都没有被访问,则该点不能知道所有点;
3.刚开始想错了,想着正着要遍历到所有点或者倒着要遍历到所有点才行,这样才30分,而且觉得自己很对,30分的朋友可以康康是不是这个错QAQ;

代码:

#define IOS ios::sync_with_stdio(false);cin.tie(0)
#include<bits/stdc++.h>
using namespace std;
#define mem(a,x) memset(a,x,sizeof(a))
#define pb(a) push_back(a)
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
const int MAX_N=1005;
vector<int> v[2][MAX_N];
bool vst[2][MAX_N];
void dfs(int now,int k){
	vst[k][now]=true;
	for(auto e:v[k][now]){
		if(!vst[k][e]) dfs(e,k);
	}
}
int main(){
	IOS;
	int n,m;
	cin>>n>>m;
	rp(i,m){
		int a,b;
		cin>>a>>b;
		v[0][a].pb(b);
		v[1][b].pb(a);
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		mem(vst,0);
		for(int k=0;k<2;k++) dfs(i,k);
		rpn(j,n){
			if(vst[0][j]==0&&vst[1][j]==0) goto here;
		}
		ans++;
		here:;
	}
	cout<<ans;
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308866.html