[BZOJ 3108] 图的逆变换
Link:
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; }