题目链接:
P2419 [USACO08JAN]Cow Contest S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
解题思路:
若点i能走到其他n - 1个点,则能确定该点的排名。
某点是否能走到其他n - 1个点可以用floyd算法:
#include <queue> #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N = 110; int n, m; bool f[N][N]; int main() { cin >> n >> m; for (int i = 1; i <= m; i ++ ) { int a, b; scanf("%d %d", &a, &b); f[a][b] = true;//a能走到b } 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];//若i到k即f[i][k] = true, 切k能到j即f[k][j] = true //则说明i能到j, 这里不能用等于号,因为只要出现了一条i能到j则f[i][j] = true, int ans = 0; for (int i = 1; i <= n; i ++ ) { int res = 1; for (int j = 1; j <= n; j ++ )//若i能到达其他n - 1个点 { if (i == j) continue; res = res & (f[i][j] || f[j][i]); } ans += res; } cout << ans << endl; return 0; return 0; }