传送门

当时在场上的时候,不可能的情况判断不知道怎么弄,一下场就比较清晰了。

#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;
}