#include <iostream>
using namespace std;
int arry[105][105];
int ans[105];
void input()
{
int n,m,a,b;
cin>>n>>m;
memset(arry,0,sizeof(arry));
memset(ans,0,sizeof(ans));
for(int i=0;i<m;++i)
{
cin>>a>>b;
arry[a][b]=1;
}
for(int k=1;k<=n;++k)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(i!=j&&!arry[i][j])
arry[i][j]=arry[i][k]&&arry[k][j];
}
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(arry[i][j])
{
ans[i]++;
ans[j]++;
}
}
}
int sum=0;
for(int i=1;i<=n;++i)
{
if(ans[i]==n-1)sum++;
}
cout<<sum<<endl;
}
int main()
{
input();
return 0;
}
题目大意:JF有很多牛,但是这些牛不听话,经常想干仗,这可不是好事,每头牛有他的战斗指数,指数高的能战胜指数底的,JF这个人他想改变这种情况,给这些牛排名,那样牛就不会干仗了,因为他知道他能不能打赢,但是为了排名,JF就让这些牛打了一次.现在给出N,M,两个数,N代表牛的头数,M代表比赛的次数.M行A,B,表示A能打败B,现在让你确定有多少头牛的名次能够确定。
算法分析:要确定一头牛的排名你要知道这个牛与其他所有牛的关系,要么能打败其他的,要么被其他的打败.首先用floyed方法确定每头牛的出度和入度,如果出度+入度的和等于N-1,就表示这头牛的排名能唯一确定.floyed的时间复杂度是O(n^3),他不适合很多的数据.