[BZOJ 3108] 图的逆变换

Link:

BZOJ 3108 传送门

Solution:

样例教你做题系列

观察第三个输出为No的样例,发现只要存在$edge(i,k),edge(j,k)$,那么$i,j$的出边一定要全部相同

于是判断有相同出边的$i,j$是否有$edge(i,p)$但没有$edge(j,p)$即可判断是否输出No

Code:

#include <bits/stdc++.h>

using namespace std;
const int MAXN=305;
int n,m,x,y,T,e[MAXN][MAXN];

bool solve()
{
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
        {
            bool f=false;
            for(int k=1;k<=n;k++) if(e[i][k]&&e[j][k]) f=true;
            if(!f) continue;
            for(int k=1;k<=n;k++) if(e[i][k]+e[j][k]==1) return false;
        }
    return true;
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        memset(e,0,sizeof(e));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
            scanf("%d%d",&x,&y),e[x+1][y+1]=true;
        if(solve()) puts("Yes");
        else puts("No");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/newera/p/9237949.html