题意: 每个样例第一行有两个数字n,m表示有1-n个元素,m个关系
每一个关系由两个数字a,b组成表示a元素大于b元素,输出n个数字表示1-n个元素可不可能为中位数(可能在它的位置上输出1否则输出0)
思路: 感觉这道题有些点要注意,有两种矛盾的情况,第一种是输入u=v时,第二种是存在u>v并且v>u。这种题可以floyd闭包做。
中位数就是要判断大于它的数字不能多于一半小于它的数字也不能多于一半。
code:
#include<bits/stdc++.h>
using namespace std;
int t, n, m, dis[110][110], l[110], r[110];
int main() {
cin >> t;
while(t--) {
memset(dis, 0, sizeof dis);
memset(l, 0, sizeof l);
memset(r, 0, sizeof r);
cin >> n >> m;
int flag = 0;
for(int x, y, i = 0; i < m; i++) {
cin >> x >> y;
if(x == y)
flag = 1;
dis[x][y] = 1;
}
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
dis[i][j] |= (dis[i][k] & dis[k][j]);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i != j && dis[i][j])
r[i]++, l[j]++;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(dis[i][j] == 1 && dis[j][i] == 1)
flag = 1;
if(flag)
for(int i = 1; i <= n; i++)
cout << 0;
else
for(int i = 1; i <= n; i++) {
if(l[i] > n / 2 || r[i] > n / 2)
printf("0");
else
printf("1");
}
cout << endl;
}
return 0;
}