Graph Theory A 2019_GDUT_ newborn topic - Cow Contest

topic

N (1 ≤ N ≤ 100) cows, conveniently numbered 1…N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the competitors.

The contest is conducted in several head-to-head rounds, each between two cows. If cow A has a greater skill level than cow B (1 ≤ A ≤ N; 1 ≤ B ≤ N; A ≠ B), then cow A will always beat cow B.

Farmer John is trying to rank the cows by skill level. Given a list the results of M (1 ≤ M ≤ 4,500) two-cow rounds, determine the number of cows whose ranks can be precisely determined from the results. It is guaranteed that the results of the rounds will not be contradictory.

Input

  • Line 1: Two space-separated integers: N and M
  • Lines 2…M+1: Each line contains two space-separated integers that describe the competitors and results (the first integer, A, is the winner) of a single round of competition: A and B

Output

  • Line 1: A single integer representing the number of cows whose ranks can be determined

Sample Input
5 5
4 3
4 2
3 2
1 2
2 5
Sample Output
2

The cow as a point, if j i can beat bovine cattle, there is a length from the i to j path 1 is unidirectional, i to j has a one-way path length of -1, to a point so that whether the problem in communication. If a cow connectivity to all other cattle, the cow's level is that you can determine. One hundred head of cattle, you can use floyd. Floyd not run when the comparison size, but by the two paths is not selected are 1 or both -1, i represents a cow> k cow> j or i bovine cattle <k bovine <j cattle.

Code:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,a[1000][1000];

int main()
{
	int A,B;
	cin>>n>>m;
	memset(a,INF,sizeof(a));
	for (int i=1;i<=m;i++)
	{
		cin>>A>>B;
		a[A][B]=1;
		a[B][A]=-1;
	}
	for (int k=1;k<=n;k++)
		for (int i=1;i<=n;i++)
			for (int j=1;j<=n;j++)
				if (a[i][k]==a[k][j] && a[i][k]!=INF)
				a[i][j]=a[i][k];
	int ans=0,sum=0;
	for (int i=1;i<=n;i++)
	{
		sum=0;
		for (int j=1;j<=n;j++)
		{
			if (a[i][j]!=INF)
			sum++;
		}
		if (sum==n-1)
		ans++;
	}
	cout<<ans;
	return 0;
}
Published 14 original articles · won praise 0 · Views 294

Guess you like

Origin blog.csdn.net/qq_39581539/article/details/104011510