题意:给你很多柱子(奇数个),每个珠子都有其重量,下面的关系是给出的轻重关系,按照质量的大小来排序,让你判断不可能是中值点的个数。
思路:简单的传递闭包入门题,
flody判断传递闭包的方法
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if((map[i][k]&&map[k][j])||map[i][j]) 如果不懂的话,可以baidu下
map[i][j] = true;
用flody判断出所有的轻重关系以后,继续寻找找出大于这个数的个数大于一半或是小于这个数的个数大于一半的数的个数。用num来记录。
唯一需要想清楚的一点是:如果大于(小于)一半之后,不可能存在还有小于(大于)一半。
#include<cstdio> #include<cstring> #include<iostream> #define N 101 using namespace std; bool map[N][N]; int n,m; int main(void) { int t; cin>>t; while(t--) { memset(map,false,sizeof(map)); int num = 0; cin>>n>>m; int flag = n/2; for(int i=1;i<=m;++i) { int a,b; scanf("%d %d",&a,&b); map[a][b] = true; } for(int k=1;k<=n;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if((map[i][k]&&map[k][j])||map[i][j]) map[i][j] = true; int tmp; for(int i=1;i<=n;++i) { tmp = 0; for(int j=1;j<=n;++j) if(map[j][i]) ++tmp; if(tmp>flag) ++num; } for(int i=1;i<=n;++i) { tmp = 0; for(int j=1;j<=n;++j) if(map[i][j]) ++tmp; if(tmp>flag) ++num; } cout<<num<<endl; } return 0; }