分析
本题需要判断每个点能否到达所有点,所以对每条边建立正反边(两个链表),之后对每个点bfs,看其是否能到所有点,如果能,ans++。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int h[N],e[N*10],ne[N*10],idx; //建立正边a->b
int H[N],E[N*10],Ne[N*10],Idx; //建立反边b->a
int n,m,q[N],hh,tt;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void Add(int a,int b)
{
E[Idx]=b,Ne[Idx]=H[a],H[a]=Idx++;
}
bool st1[N],st2[N];
int ans;
void bfs(int u,int h[],int e[],int ne[],bool st[]) //bfs计算当前点u能到的所有点
{
hh=0,tt=-1;
q[++tt]=u;
st[u]=1;
while(hh<=tt)
{
int t=q[hh++];
for(int i=h[t];~i;i=ne[i])
{
int j=e[i];
if(!st[j])
{
q[++tt]=j;
st[j]=1;
}
}
}
}
int main()
{
memset(h,-1,sizeof h);
memset(H,-1,sizeof H);
cin>>n>>m;
int a,b;
for(int i=0;i<m;i++)
{
cin>>a>>b;
add(a,b);
Add(b,a);
}
for(int i=1;i<=n;i++)
{
memset(st1,0,sizeof st1);
memset(st2,0,sizeof st2);
bfs(i,h,e,ne,st1);
bfs(i,H,E,Ne,st2);
int cnt=0;
for(int j=1;j<=n;j++)
{
if(st1[j] || st2[j]) cnt++;
}
if(cnt==n) ans++; //当前点能到所有点
}
cout<<ans;
return 0;
}