题意:
n个点,m条边。
若A 到 B的边存在,则证明 A 的排名一定在 B 前。
最后求所有点中,排名可以确定的点的个数。
n <= 100, m <= 4500
刚开始还在想是不是拓扑排序。
n这么小的数据范围,典型的传递闭包。直接可以用Floyd求。
求出传递闭包之后找哪些点与其他所有点都有直接关系,即所有的点和它之间排名都可以确定。计入答案。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <string> using namespace std; #define maxn 100 + 10 int main() { int n, m, a[maxn][maxn]; scanf("%d%d", &n, &m); memset(a, 0, sizeof(a)); for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); a[u][v] = 1; } for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (a[i][k] && a[k][j]) a[i][j] = 1; int ans = 0; for (int i = 1; i <= n; i++) { bool flag = true; for (int j = 1; j <= n; j++) if (i != j && !a[j][i] && !a[i][j]) flag = false; if (flag) ans++; } printf("%d ", ans); }