P1129 [ZJOI2007] 矩阵游戏 分析: 这题是个思维题,有以下几个结论不管是行交换还是列交换,原本在同一行的还是同一行(列同理),即不会破坏同一行(列)的平衡性要使达到最后的结果,则每一行都对应着一个,每一列也都对应着一个将行列分开来看(两个集合),便是二分图了,而且要是二分图完全匹配输出 “Yes” #include <bits/stdc++.h> using namespace std; const int N = 1005; vector <int> e[N]; int pre[N], vis[N]; bool dfs(int u, int tag) { if (vis[u] == tag) return false; // 即说明已经被访问了,就不需要清空了 // 其实只是将bool改成用数字标记,快的也很有限 vis[u] = tag; for (auto v : e[u]) { if(!pre[v] || dfs(pre[v], tag)) { pre[v] = u; return true; } } return false; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T,n; cin>>T; while(T--) { cin>>n; for(int i=1;i<=n;i++) { e[i].clear(); for(int j=1;j<=n;j++) { int p; cin>>p; if(p) e[i].push_back(j); } } int ans=0; memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); for(int i=1;i<=n;i++) { if(dfs(i,i)) ans++; } if(ans==n) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }