题目链接:传送门
【题意】:
对于一个包含n个数的(n为奇数)序列val[ ],排序后的 val[ (n+1) / 2 ] 定义为 median;
有 n 个数,并有 m 组关系,对于第 i 组关系 ai,bi 代表第 val[ai] > val[bi];
但并没有给出具体的数值;
输出一个包含 n 个元素的数组 s[ ] ;
让你判断第 i 个数 val[ i ]是可能为中位数,如果是,第 i 位为 1;
如果不是,第 i 位为 0;
输出 n 个数,其中第 i 个数为 0 或 1,含义如上;
【题解】:
1、判环,只要有环全零
2、跑一个Flody来时算出来,然后直接处理即可,
最后加判断
正向cnt1<=n/2
反向cnt2<=n/2
即可
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
int a[N][N];
int vis[N];
int main()
{
int n,m,T,u,v;
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
while( m-- ){
scanf("%d%d",&u,&v);
a[u][v] = 1;
}
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d%c",a[i][j],j==n?'\n':' ');
}
}
*/
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if( a[i][k] && a[k][j] ){
a[i][j] = 1;
}
}
}
}
int F = 1 ;
for(int i=1;i<=n;i++){
int cnt1 = 0;
int cnt2 = 0;
for(int j=1;j<=n;j++){
cnt1 += a[i][j];
cnt2 += a[j][i];
if( a[i][j] && a[j][i] ){
F = 0;
}
}
if( cnt1 <= (n/2) && cnt2 <=(n/2) ){
vis[i] = 1;
}
}
if( !F ) memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
printf("%d",vis[i]?1:0);
}
printf("\n");
}
return 0;
}