题解
按照题意所要求的能确定的情况下 其它所有人都要与这个人有联系(能间接性确定他比其它人要强或者没其它人强) 否则无法确定
用Floyd求出每个点是否能到达其它点(比它强) 对行和列求和判断是否大于等于N-1(有时候能到达自身而有时不行)
附dalao样例
5 4
1 3
2 3
3 4
3 5
结果为
1
AC代码
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 110;
int g[MAXN][MAXN];
void Floyd(int n)
{
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
g[i][j] |= g[i][k] & g[k][j]; //只需求是否可达 使用位运算
}
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int N, M;
cin >> N >> M;
for (int i = 0; i < M; i++)
{
int u, v;
scanf("%d%d", &u, &v);
g[u][v] = 1;
}
Floyd(N);
int ans = 0;
for (int i = 1; i <= N; i++)
{
int cnt = 0; //如果其它所有点到这个点都有关系则可以确定
for (int j = 1; j <= N; j++)
if (g[i][j] || g[j][i])
cnt++;
if (cnt >= N - 1) //floyd可能会导致g[i][i]为1
ans++;
}
cout << ans << endl;
return 0;
}