poj 3660 Cow Contest

dp,图论

题意:输入n和m表示n个牛(从1到n标号),下面m个信息,A B,表示A牛能打赢B牛。现在要给所有的牛排名(按实力从高到低),问哪些牛的排名是可以确定的

如果知道由l个人能打赢自己,自己能打赢w个人,且l+w+1 = n的话,那么自己的排名就是可以确定的,所有转化为要求出,每个人,能打赢多少人,能被多少人打赢

建图: dp[i][j]=1表示i能打赢j,=0表示不确定他们之间的关系,然后类似floyd那样dp,

若dp[i][k]=1且dp[k][j]=1,则dp[i][j]=1

dp结束后扫描一次整个dp数组即可

被归为中等题,这不是水题么。。。。

#include <cstdio>
#include <cstring>
#define N 110

int dp[N][N];
int n,m;

int main()
{
   while(scanf("%d%d",&n,&m)!=EOF)
   {
      memset(dp,0,sizeof(dp));
      for(int i=0; i<m; i++)
      {
         int u,v;
         scanf("%d%d",&u,&v);
         dp[u][v] = 1;
      }

      for(int k=1; k<=n; k++)
         for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
               if(dp[i][k] && dp[k][j])
                  dp[i][j] = 1;
      int res = 0;
      for(int i=1; i<=n; i++)
      {
         int lose = 0 , win = 0;
         for(int k=1; k<=n; k++)
         {
            if(dp[k][i])
               lose++;
            if(dp[i][k])
               win++;
         }
         if(lose + win + 1 == n) res++;
      }
      printf("%d\n",res);
   }
   return 0;
}
原文地址:https://www.cnblogs.com/scau20110726/p/3058554.html