https://vjudge.net/contest/311348#problem/A
思路:用floyd传递闭包处理点与点之间的关系,之后开数组记录每个数字比它大的个数和小的个数,如果这个个数超过n/2那么它不可能作为中位数,其他的都有可能。
#include<bits/stdc++.h> using namespace std; int e[105][105]; int maxx[105]; int minn[105]; int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); memset(e,0,sizeof(e)); int flag=1; for(int i=1; i<=m; i++) { int a,b; scanf("%d%d",&a,&b); if(a==b) flag=0; e[a][b]=1; } memset(maxx,0,sizeof(maxx)); memset(minn,0,sizeof(minn)); for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) e[i][j]|=e[i][k]&e[k][j]; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(e[i][j]&&e[j][i]) flag=0; if(e[i][j]==1) { maxx[j]++; minn[i]++; } } if(flag==0) { for(int i=1; i<=n; i++) printf("0"); if(t!=0) printf("\n"); continue; } for(int i=1; i<=n; i++) { if(maxx[i]>(n/2)||minn[i]>(n/2)) printf("0"); else printf("1"); } if(t!=0) printf("\n"); } }