题目大意:一群牛比胜负,然后balabala,然后给你一堆关系,让你求出能够判断出名次的牛的个数。
算法思路:这道题主要的用的是传递闭包,然后只要判断该牛的入度和出度之和等于n-1,就说明该牛能判断出名次。
#include <iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define MAXN 105 int n,m,a,b,res; int p[MAXN][MAXN],in[MAXN],out[MAXN],flag[MAXN]; bool visited[MAXN],tmp[MAXN][MAXN]; queue<int>que; int main() { while(true) { res=0; memset(p,0,sizeof(p)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(visited,false,sizeof(visited)); memset(tmp,0,sizeof(tmp)); scanf("%d%d",&n,&m); if(n==0&&m==0) break; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); p[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(p[i][k]&&p[k][j]) p[i][j]=1; } } } //int cnt1=0,cnt2=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(p[i][j]) { out[i]++; in[j]++; } } } for(int i=1;i<=n;i++) { if((in[i]+out[i])==n-1) res++; } printf("%d\n",res); } return 0; }