给你一堆奶牛间的胜负关系,问有多少头奶牛可以确定排位。
确定排位的意思就是某一头奶牛和其余n-1头奶牛都有确定的胜负关系。
并且胜负关系具有传递性。
所以我们设两个数组来记录胜负关系,然后跑一遍,把所有的胜负关系全部推出来,最后扫一遍即可。
附代码:
#include<iostream> #include<algorithm> #include<cstdio> #define MAXN 110 using namespace std; int n,m,ans=0; bool win[MAXN][MAXN],lose[MAXN][MAXN]; char tp[100000],*p1=tp,*p2=tp; inline char get_char(){ return p1==p2&&(p2=(p1=tp)+fread(tp,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int read(){ int date=0,w=1;char c=0; while(c<'0'||c>'9'){if(c=='-')w=-1;c=get_char();} while(c>='0'&&c<='9'){date=date*10+c-'0';c=get_char();} return date*w; } void floyd(){ for(int k=1;k<=n;k++)for(int i=1;i<=n;i++){ if(i==k)continue; for(int j=1;j<=n;j++){ if(i==j||j==k)continue; win[i][j]|=(win[i][k]&&win[k][j]); lose[i][j]|=(lose[i][k]&&lose[k][j]); } } } void work(){ for(int i=1,s;i<=n;i++){ s=0; for(int j=1;j<=n;j++)s+=win[i][j]+lose[i][j]; if(s==n-1)ans++; } printf("%d\n",ans); } void init(){ n=read();m=read(); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)win[i][j]=lose[i][j]=false; for(int i=1,x,y;i<=m;i++){ x=read();y=read(); win[x][y]=lose[y][x]=true; } floyd(); } int main(){ init(); work(); return 0; }