题意:给出牛的个数N,M个结果A和B(A能打败B)。问有多少头牛的rank已经确定。
思路:求每一头牛相关的边数(即度的大小,如果度的大小等于n-1,表示其他牛与他的关系已经确定,则这个牛的rank也就确定了)。如果有一个点,排名在它之前的和排名在它之后的点之和为n-1,那么它的排名就是确定的。
#include <cstdio>
#include <cstring>
using namespace std;
int map[105][105];
int res[105];
int N,M;
void floyd(){
for (int k = 0; k <= N ; ++k)
{
for (int i = 0; i <= N ; ++i)
{
for (int j = 0; j <= N ; ++j)
{
map[i][j]=map[i][j]||(map[i][k]&&map[k][j]);
}
}
}
}
int main(int argc, char const *argv[])
{
while(~scanf("%d%d",&N,&M)){
memset(map,0,sizeof(map));
memset(res,0,sizeof(res));
int x,y;
for (int i = 0; i < M; ++i)
{
scanf("%d%d",&x,&y);
map[x][y]=1;
}
floyd();
int ans=0;
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N ; ++j)
{
if(map[i][j]){
if(++res[i]==N-1){
ans++;
}
if(++res[j]==N-1){
ans++;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}