思路:
每个节点用BFS或者DFS正向,反向遍历两次,记录访问过的节点,若所有节点均访问过则符合要求,总数加一。
易错点:
本题数据结构应使用邻接表存储;若使用邻接矩阵存储则会导致超时。
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
vector<int>adj1[N],adj2[N];
bool inq1[N],inq2[N];
void BFS(int u,vector<int> adj[],bool inq[]){
int temp=u;
fill(inq,inq+N+1,false);
queue<int> q;
q.push(u);
inq[u]=true;
while(!q.empty()){
int u=q.front();
q.pop();
for(int j=0;j<adj[u].size();j++){
int v=adj[u][j];
if(inq[v]==false&&adj[u][j]!=0){
q.push(v);
inq[v]=true;
}
}
}
}
int main(){
//输入
int n,m,ans=0;
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
adj1[a].push_back(b);
adj2[b].push_back(a);
}
//处理
for(int i=1;i<n+1;i++){
int flag=1;
BFS(i,adj1,inq1),BFS(i,adj2,inq2);
for(int j=1;j<=n;j++){
if(inq1[j]==0&&inq2[j]==0){
flag=0;
break;
}
}
if(flag==1)ans++;
}
cout<<ans;
return 0;
}
样例:
/*
4 4
1 2
1 3
2 4
3 4
*/