当时在场上的时候,不可能的情况判断不知道怎么弄,一下场就比较清晰了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e3+10;
bool vis[maxn];
vector<int>s[maxn],l[maxn];
queue<int>que;
int sma[maxn],lar[maxn];
int mp[maxn][maxn];
int n,m,u,v;
bool Judge()
{
for(int i = 1;i <= n; i++)
{
for(int j = 1;j <= n; j++)
{
for(int k = 1;k <= n; k++)
{
if(mp[i][j] == 1 && mp[k][i] == 1)
mp[k][j] = 1;
}
}
}
for(int i = 1;i <= n; i++)
{
for(int j = 1;j <= n; j++)
{
if(mp[i][j] == 1 && mp[j][i] == 1)
return false;
}
}
return true;
}
int Bfssma(int x)
{
while(!que.empty())
que.pop();
memset(vis,false, sizeof(vis));
que.push(x);
vis[x] = true;
int ans = -1;
while (!que.empty())
{
ans++;
int top = que.front();
que.pop();
for(int i = 0;i < s[top].size(); i++)
{
int g = s[top][i];
if(!vis[g])
{
vis[g] = true;
que.push(g);
}
}
}
return ans;
}
int Bfslar(int x)
{
while(!que.empty())
que.pop();
memset(vis,false, sizeof(vis));
que.push(x);
vis[x] = true;
int ans = -1;
while (!que.empty())
{
ans++;
int top = que.front();
que.pop();
for(int i = 0;i < l[top].size(); i++)
{
int g = l[top][i];
if(!vis[g])
{
vis[g] = true;
que.push(g);
}
}
}
return ans;
}
int main()
{
//freopen("in","r",stdin);
int T;
scanf("%d",&T);
while (T--)
{
memset(mp,0, sizeof(mp));
scanf("%d %d",&n,&m);
for(int i = 0;i <= n; i++)
{
s[i].clear();
l[i].clear();
}
for(int i = 0;i < m; i++)
{
scanf("%d %d",&u,&v);
mp[u][v] = 1;
s[u].push_back(v);
l[v].push_back(u);
}
if(Judge() == false)
{
for(int i = 0;i < n; i++)
printf("0");
printf("\n");
continue;
}
for(int i = 1;i <= n; i++)
{
sma[i] = Bfssma(i);
lar[i] = Bfslar(i);
}
int mid = (n + 1) / 2;
for(int i = 1;i <= n; i++)
{
int l = sma[i] + 1;
int r = n - lar[i];
if(l <= mid && r >= mid)
printf("1");
else
printf("0");
}
printf("\n");
}
return 0;
}