题目和这个几乎一样:珍珠比大小
加一个小判断就行了。
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int N=100+30;
int a[N][N],b[N][N],num1[N],num2[N];
void init()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
}
int main()
{
int n,m,x,y;
int _;
cin >> _;
while(_--){
cin>>n>>m;
init();
bool flag = 0;
for(int i=1;i<=m;i++)
{
cin>>x>>y;
/*if(x==y)
flag=1;*/
a[x][y]=1;//x比y重
b[y][x]=1;//y比x轻
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j||i==k||j==k)continue;
if(a[i][k]&&a[k][j])//若i比k重且k比j重
{
a[i][j]=1;//则i比j重
b[j][i]=1;//则j比i轻
}
if(b[i][k]&&b[k][j])//若i比k重且k比j轻
{
b[i][j]=1;//则i比j轻
a[j][i]=1;//则j比i重
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]&&a[j][i])
{
flag=1;
break;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)continue;
if(a[i][j])num1[i]++;//统计比i重的个数
if(b[i][j])num2[i]++;//统计比i轻的个数
}
}
int sum=0;
int ve[100+3];
int t=-1;
if(!flag)
{
for(int i=1;i<=n;i++)
{
if(num1[i]<=(n)/2 && num2[i] <= (n)/2)cout<<1;//枚举符合条件的点
else cout<<0;
}
}
else
{
for(int i=1;i<=n;i++)
{
cout<<0;
}
}
cout<<endl;
}
return 0;
}