题目描述
现在PIPI有一个有向图G , 他想知道这个有向图中有多少点对满足 u 能到达 v 并且 v 也能到达 u (u≠v)。
输入
输入第一行是两个数字 n,m 。代表该有向图的顶点数和边数 (n<=500, m<=10000)。
接下来m行每行两个数字 u 和 v, 代表 u 能够到达 v (1<=u,v<=n)。
输出
输出能够互相可达的点对数量。
样例输入
2 2
1 2
2 1
样例输出
1
思路:弗洛伊德算法
#include<bits/stdc++.h>
using namespace std;
int mp[505][505];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v),u--,v--;
mp[u][v]=1;
}
for(int k=0;k<n;++k) ///将i所有可以到达的点在矩阵中置1
for(int i=0;i<n;++i)
for(int j=0;j<=n;++j)
if(mp[i][k]&&mp[k][j])
mp[i][j]=true;
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(mp[i][j]==mp[j][i]&&mp[i][j])
ans++;
}
}
printf("%d",ans);
}