# Transitive closure

Time Limit: 1000 ms Memory Limit: 65536 KiB

### Problem Description

It is known that there are n cattle, m times of combat relationship. Ask the number of cattle that can finally determine the ranking.

### Input

For multiple groups of test data, for each group of test data, input two integers n (1 < = n < = 100) and m (0 < = m < = 4950) in the first row, respectively, to indicate that there are n cattle and m times of combat relationship, and then input two positive integers x and Y in each row of m to indicate that cattle with No. x can defeat cattle with No. y, the data is legal, and query can determine the number of cattle in the ranking.

### Output

For each group of test data, the output integer ans indicates the number of cows that can determine the ranking.

```5 5
4 3
4 2
3 2
1 2
2 5```

### Sample Output

`2`
```#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int ralationship[105][105];///Array to determine if there is a relationship
void f(int);///Calculate transfer relationship
int main()
{
int n, m, i, j, x, y, sum1, sum2;
while(~scanf("%d %d", &n, &m))
{
memset(ralationship, 0, sizeof(ralationship));
while(m--)
{
scanf("%d %d", &x, &y);
ralationship[x][y] = 1;///Enter the two cows that determine the relationship
}
f(n);///Call function to calculate transfer relationship
sum2 = 0;///Number of cows that can be ranked
for(i = 1; i <= n; i++)
{
sum1 = 0;///Number of relationships between cattle i and other n - 1 cattle
for(j = 1; j <= n; j++)
{
if(i == j)  continue;///If i = j points to a cow, there is no operation in this cycle
if(ralationship[i][j] || ralationship[j][i])  sum1++;///If i is related to j-n, sum1++
}
if(sum1 == n - 1)  sum2++;///If sum1 = n - 1, that is, the relationship between this cow and other N - 1 cows is determined, then its ranking is determined
}
printf("%d\n", sum2);
}
return 0;
}
void f(int n)
{
int i, j, k;
for(k = 1; k <= n; k++)
{
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{///When I beat J or (I beat k and k beat J) holds at least one, i.e. the relationship between I and j is determined and assigned as 1
ralationship[i][j] = ralationship[i][j] || (ralationship[i][k] && ralationship[k][j]);
}
}
}
}```

Tags: Programming

Posted on Thu, 07 Nov 2019 13:55:46 -0500 by Gighalen