Cow Contest

#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),他不适合很多的数据.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值