原题链接:http://poj.org/problem?id=3660
专题链接:https://vjudge.net/contest/351234#problem/A
思路
看到N<=100,可以用floyd做,但难点在于如何根据两对点之间的直接大小关系判断一对点间接大小关系(如I>K,K>J可以推出I>J;而I>K,J>K则不能推出任何额外的大小关系),明白了这点后,我们就能轻松ac了;
ac代码如下
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int m[101][101];//用于储存大小关系,前参代表的牛>后参代表的牛,同时也代表后参代表的牛<前参代表的牛,这也是推算大小关系是只用推算大于的即可
int N, M;
int main()
{
cin >> N >> M;
while (M--)//输入部分
{
int i, j;
scanf("%d%d", &i, &j);
m[i][j] = 1;//将存在大小关系的牛对储存,由于我们的大小关系是单向的,不能再m[j][i]=m[i][j]
}
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
for (int j = 1; j <= N; j++)
{
if (i == j)
continue;
if (m[i][k] && m[k][j])//如果i>k并且k>j可以推出i>j
m[i][j] = 1;
}
int ans = 0;
for (int k = 1; k <= N; k++)//用m数组的对角线来储存k的大小关系之和
{
for (int i = 1; i<= N;i++)
{
if (i == k)
continue;
m[k][k] += m[k][i];//储存k的大于关系
m[k][k] += m[i][k];//储存k的小于关系
}
}
for (int k = 1; k <= N; k++)
if (m[k][k] == N - 1)//如果k牛的大小关系有N-1种,答案+1;
ans++;
printf("%d\n", ans);
return 0;
}