时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小猫在研究有向图。小猫在研究联通性。
给定一张N个点,M条边的有向图,问有多少点对(u,v)(u<v),满足u能到达v且v也能到达u。
输入描述:
第一行两个正整数N,M,表示点数与边数。接下来M行,第i行两个正整数ui,vi,表示一条从ui到vi的边,保证ui≠vi。
输出描述:
一行一个整数,表示点对数量。
示例1
输入
3 3
1 2
2 3
3 2
输出
1
备注:
1≤N≤300,1≤M≤N(N−1)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=305;
int n,m;
int mp[maxn][maxn];
int main(){
int a,b;
memset(mp,INF,sizeof(mp));
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d %d",&a,&b);
mp[a][b]=1;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
}
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j&&mp[i][j]<INF&&mp[j][i]<INF)
cnt++;
}
}
printf("%d\n",cnt/2);
return 0;
}