题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1612

解:莫名就成了图。。。我们把A赢了B当做A到B的一条单向边,然后从每个点都dfs一次,(我直接用floyd,反正接受的了n^3...)

能到的点就加上一,最后如果哪个点能到它和它能到的次数之和等于n-1的,就说明它的名次是确定的。

程序:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool f[300][300];
int n,m,a,b;
int main()
{
  scanf("%d%d",&n,&m);
  for (int i=1;i<=m;i++)
  {
      scanf("%d%d",&a,&b);
      f[a][b]=true;
  }
  for (int k=1;k<=n;k++)
  for (int i=1;i<=n;i++)
   for (int j=1;j<=n;j++)
     f[i][j]=f[i][j]|(f[i][k]&f[k][j]);
  int ans=0; 
  for (int i=1;i<=n;i++)
  {
    int tot=0;
    for (int j=1;j<=n;j++)
    if ((f[i][j])||(f[j][i])) tot++;
    if (tot==n-1) ans++;
  }
  printf("%d\n",ans);
  return 0;
}

 

posted on 2017-04-03 00:08  nhc2014  阅读(170)  评论(0编辑  收藏  举报