原题链接
n的数据很小,不到100.。。。。
我一直以为下面那个2*103是n的范围。。。。
把大小关系比作一条路径,跑一遍floyd即可,最后计算对于每个点而言,一定比这个点大\小的点有多少,只要不大于n/2就可能为中位数
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int cnt,cnt2,flag;
int head[6005],head2[6005],d[3000],f[3000],c[2005][2005],vis[2005];
void init()
{
memset(head,-1,sizeof(head));
memset(head2,-1,sizeof(head2));
memset(d,0,sizeof(d));
memset(f,0,sizeof(f));
for(int i=0;i<2002;i++)
{
for(int j=0;j<2002;j++)
{c[i][j]=99999999;}
}
}
int main()
{
int t,n,m,x,y;
scanf("%d",&t);
while(t--)
{
init();
cnt=1;cnt2=1;flag=1;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
if(x==y)
{flag=0;continue;}
c[x][y]=1;
//add(x,y);
}
if(flag==1)
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(c[i][k]+c[k][j]<c[i][j])
{c[i][j]=c[i][k]+c[k][j];}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(c[i][j]!=99999999&&c[j][i]!=99999999)
{flag=0;break;}
}
if(flag==0){break;}
}
}
if(!flag)
{
for(int i=1;i<=n;i++)
{printf("0");}
printf("\n");
continue;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(c[i][j]!=99999999)
{f[i]++;d[j]++;}
}
}
int stand=n/2;
for(int i=1;i<=n;i++)
{
if(f[i]>stand || d[i]>stand)
{printf("0");}
else
{printf("1");}
}
printf("\n");
}
return 0;
}