skywalkerts space

题目:?id=1059

题意:给定一个n * n的01矩阵,可以任意交换两行或两列的数字,问是否能调整出一个局面,使得矩阵的主对角线(左上角到右下角的连线)上都是1。。

题解: 由于每次可以变化一些元素为1的点的行号与列号,但是其相对位置是不变的,也就是说对于的排列,所以我们可以抛弃这些点的行号与列号来分析他们的相对关系。 目标局面是处元素为1则代表第i列与第j列可以匹配。 题目转化为二分图匹配,每一行匹配一列,均能成功匹配则存在调整方案,时间复杂度。

代码:

maxn = 201;int n, mark[maxn];bool vis[maxn][maxn], y[maxn];bool find(int x){for(int i = 1; i <= n; ++i)if(vis[x][i] && !y[i]){y[i] = 1;if(!mark[i] || find(mark[i])){mark[i] = x;return 1;}}return 0;}bool check(){for(int i = 1; i <= n; ++i){memset(y, 0, sizeof y);if(!find(i)) return 0;}return 1;}int main(){int t;scanf(“%d”, &t);while(t–){memset(vis, 0, sizeof vis);memset(mark, 0, sizeof mark);scanf(“%d”, &n);for(int i = 1, x; i <= n; ++i)for(int j = 1; j <= n; ++j){scanf(“%d”, &x);if(x) vis[i][j] = 1;}puts(check() ? “Yes” : “No”);}return 0;}

,烦恼忧愁不用追,吃点好的别嫌贵,

skywalkerts space

相关文章:

你感兴趣的文章:

标签云: