[ABC292E] Transitivity 题解
本题需要使用简单的 BFS 算法。
注意到题目中的条件“若
这样只用对于每个点
放代码:
#include<bits/stdc++.h>
using namespace std;
main(){
ios::sync_with_stdio(false);
int n,m,c=0; cin>>n>>m;
vector<vector<int> > g(n);
vector<int> d(n);
for(int i=1;i<=m;i++){
int u,v; cin>>u>>v;
g[--u].emplace_back(--v);
}
for(int i=0;i<n;i++){
vector<bool> b(n); // 打标记的数组,表示每个点是否被遍历过
queue<int> q; q.emplace(i),b[i]=true;
while(!q.empty()){
int t=q.front(); q.pop();
for(int j:g[t])if(!b[j])
b[j]=true,q.emplace(j),d[i]++;
} // 经典广搜
c+=d[i]-g[i].size(); // d[i] 即为能到达的点的个数
}
cout<<c<<endl;
return 0;
}