POJ 3660题

//解题思路:这道题是一道关于floyd的图论题。题目的意思是说有n头牛比赛,m种比赛结果,最后问你一共有多少头牛的排名被确定了,其中如果a战胜b,b战胜c,则也可以说a战胜c,即可以传递胜负。
//这样如果一头牛的被x头牛打败,打败y头牛,且x+y=n-1,则我们容易知道这头牛的排名就被确定了,所以我们只要将任何两头牛的胜负关系确定了,在遍历所有牛判断一下是否满足x+y=n-1,将满足这个条件的牛数目加起来就是所求解。
//抽象为简单的floyd算法,在加上每个顶点的出度与入度 (出度+入度=顶点数-1,则能够确定其编号)
#include <stdio.h>
#include <string.h>
#define arraysize 101
int map[arraysize][arraysize];
int main()
{
 //freopen("1.txt","r",stdin);
 int n,m;
 while(scanf("%d%d",&n,&m)!=EOF)
 {
  memset(map,0,sizeof(map));
  int a,b;
  for(int i=0;i<m;++i)
  {
   scanf("%d%d",&a,&b);
   map[a][b] = 1;
  }
  //确定传递闭包
  for(int i1=1;i1<n+1;++i1)
  {
   for(int i2=1;i2<n+1;++i2)
   {
    for(int i3=1;i3<n+1;++i3)
    {
     if(map[i2][i1] == 1 && map[i1][i3]==1)
     {
      map[i2][i3] = 1;
     }
    }
   }
  }
  int ans = 0;
  for(int i4=1;i4<n+1;++i4)
  {
   int temp = 0;
   for(int j=1;j<n+1;++j)
   {
    //不计算本身的环
    if(i4 == j)
     continue;
    //计算该节点出度和入度的总和
    else if(map[i4][j] == 1 || map[j][i4] ==1)
    {
     temp++;
    }
   }
   if(temp == n-1)
    ans++;
  }
  printf("%d\n",ans);
 }
 return 0;
}

posted @ 2010-04-28 22:40  北海小龙  阅读(378)  评论(0)    收藏  举报