思路:
如果两个结点距离>=2,那么这两个点一定要加一条有向边
因此对每个点BFS统计答案即可
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1e5+10;
const int mxe=1e5+10;
queue<int> q;
struct ty{
int to,next;
}edge[mxe<<2];
int n,m,u,v,tot=0,ans=0;
int head[mxn],dis[mxn],vis[mxn];
void add(int u,int v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void bfs(int u){
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
vis[u]=1;
dis[u]=0;
q.push(u);
while(!q.empty()){
int u=q.front();
q.pop();
if(dis[u]>=2) ans++;
for(int i=head[u];~i;i=edge[i].next){
if(dis[edge[i].to]>dis[u]+1){
dis[edge[i].to]=dis[u]+1;
q.push(edge[i].to);
}
}
}
}
void G_init(){
tot=0;
for(int i=0;i<=n;i++){
head[i]=-1;
}
}
signed main(){
cin>>n>>m;
G_init();
for(int i=1;i<=m;i++){
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++) bfs(i);
cout<<ans<<'\n';
}