Cow Contest
Cow Contest
floyd求传递闭包
SCUACM2022集训前训练-图论 - Virtual Judge (vjudge.net)
若 a 大于 b,则连一条 a - > b 的边,一个点能走到的点就是比它小的点
跑一遍 floyd,就可知道任意两个点的大小关系
枚举 i, j,如果 i > j 或 i < j 就说明 i,j 的关系是可以判断的;如果所有的 j 都可以与 i 判断,则 i 这个点的次序就固定了,答案++
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 1e2 + 10;
bool f[N][N];
int n, m;
void floyd()
{
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
f[i][j] |= f[i][k] & f[k][j];
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m;
while(m--)
{
int a, b;
cin >> a >> b;
f[a][b] = true;
}
floyd();
int ans = 0;
for (int i = 1; i <= n; i++)
{
int t = 1;
for (int j = 1; j <= n; j++)
{
if (i == j)
continue;
t &= f[i][j] | f[j][i];
}
ans += t;
}
cout << ans << endl;
return 0;
}