// 如果不连通,就没有是0
// 连通的话。不能用拓扑序列。 最短距离也不可以,因为每一个点都要考虑到。
// 第一个点到所有点的最短距离也不用考虑
// 最小生成树更不用考虑了
// 用dfs。
// 能遍历通的话就是可以的,如果不行,那就不行。 真的是dfs。 图上的dfs
// 接收也是一种方法的话,是不是可以构建反向的一个图,如果能够到达所有的,那也算。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010,M = 2e4 + 10;
int h1[N],h2[N],e[M],ne[M],idx;
int st1[N],st2[N];
int n,m;
int ans;
void add(int h[],int a,int b)
{
e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}
void dfs(int u,int h[],int st[]) // 连通性判断
{
st[u] = 1; // st[u] 表示点u已经被遍历过
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if (!st[j]) dfs(j,h,st);
}
}
int main()
{
cin >> n >> m;
memset(h1,-1,sizeof h1);
memset(h2,-1,sizeof h2);
while(m--)
{
int a,b;
cin >> a >> b;
add(h1,a,b),add(h2,b,a);
}
for(int i=1;i <= n;i++)
{
int s = 0;
memset(st1,0,sizeof st1);
memset(st2,0,sizeof st2);
dfs(i,h1,st1);
dfs(i,h2,st2);
for(int j=1;j <= n;j++)
{
if(st1[j] || st2[j])
s++;
}
if(s == n) ans++;
}
cout << ans;
return 0;
}
CSP 通信网络 100分
最新推荐文章于 2024-04-22 15:24:17 发布