思路:
用0,1来存储两者之间的输赢关系,利用Floyd动态规划的思想,通过借助中间点来判断两者之间是否有输赢关系,并进行更改,对每个点进行查询,若与其有输赢关系的点为n个(初始化时我们默认自己与自己有输赢关系),则答案加一。在其中判断条件时我们有一点要注意,对于两点之间的输赢关系来说,a[i][j]与a[j][i]之间有一个为1即说明存在输赢关系,可以确定其所在位置,因为我们并不是要来确定他的大小位置是多少,我们只是要确定能否确定其大小位置。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<sstream>
#include<queue>
#define pi 3.1415926535
#define me(a,b,c) memset(a,b,sizeof c)
#define eps 0.00000001
//#define x first
//#define y second
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 3020;
int n, m, k;
int t;
int g[110][110];
void floyd() {
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() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j)g[i][j] = 1;
else g[i][j] = 0;
}
}
for (int i = 1; i <= m; i++) {
int a, b;
cin >> a >> b;
g[a][b] = 1;
}
floyd();
int ans = 0;
for (int i = 1; i <= n; i++)
{
int tmp = 0;
for (int j = 1; j <= n; j++) {
if (g[i][j] || g[j][i])tmp++;
}
if (tmp == n)ans++;
}
cout << ans << endl;
}
//
//Buddha blesses the code with no bugs
// _ooOoo_
// o8888888o
// 88" . "88
// (| -_- |)
// O\ = /O
// ____/`---'\____
// .' \| |// `.
// / \||| : |||// \
// / _||||| -:- |||||- \
// | | \\ - /// | |
// | \_| ''\---/'' | |
// \ .-\__ `-` ___/-. /
// ___`. .' /--.--\ `. . __
// ."" '< `.___\_<|>_/___.' >'"".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `-. \_ __\ /__ _/ .-` / /
// ======`-.____`-.___\_____/___.-`____.-'======
// `=---='
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//