题意给你n个珠子,然后给你M种珠子间重量关系,让你求出有多少不处在中间重量的珠子个数。
思路:首先依题意可知珠子总数为奇数,根据珠子之间的关系建图,如果一个珠子的入度或者出度大于n/2说明有大于一半的珠子大于该珠子或者有大于一半的珠子小于该珠子,因此可以根据这可以得出不处在中间重量的个数。
代码:
#include<iostream> #include<algorithm> #include<string.h> #include<cstdio> #define N 100 #define FOR(i,s,t) for(int i=(s);i<=(t);++i) using namespace std; bool map[N][N]; int n,m; void floyd() { FOR(k,1,n) FOR(i,1,n) FOR(j,1,n) if((map[i][k]&&map[k][j])||map[i][j]) map[i][j]=true; } int main() { int t; cin>>t; while(t--) { scanf("%d%d",&n,&m); FOR(i,1,n) FOR(j,1,n) if(i==j) map[i][j]=true; else map[i][j]= false; FOR(i,1,m) { int a,b; scanf("%d%d",&a,&b); map[a][b]=true; } floyd(); int ans=0; FOR(i,1,n) { int in=0,out=0; FOR(j,1,n) if(i==j) continue; else{ if(map[i][j]) out++; if(map[j][i]) in++; } if(in>n/2||out>n/2) ans++; } printf("%d\n",ans); } return 0; }