題意:給定乙個n*n的矩陣,格仔數字0或者1,通過交換兩行或兩列使對角線都是1。若不能,輸出-1;若可以,輸出交換次數,並且輸出交換的行或者列。
如果某行或者某列全是0。那怎麼換都沒辦法的。
否則,一定能換出來。
這個動動腦子想一下可以明白的。
其次要明確:只交換行或者只交換列都是可以換出來的。
這個動動腦子想一下也可以明白的。
明確了這兩點,這問題就變成了二分圖的匹配問題。
二分圖左邊的節點為每一行的行號
二分圖右邊的節點為每一行中出現的「1」對應的列號
#define _crt_secure_no_deprecate
#include#include#include#include#include#define inf 99999999;
using namespace std;
int n;
int a[110][110];
int match[110];
int vis[110];
int dfs(int u)
} }return 0;
}int hungarian()
return ans;
}int main()}}
}printf("%d\n", num);
for (int i = 0; i < num; i++)
printf("c %d %d\n", l[i], r[i]);
} }return 0;
}
HDU2819 Swap 匈牙利演算法 行列匹配
題目鏈結 sample output 1r 1 2 1給定乙個僅含有0與1的n階方陣,詢問是否可以通過行列變換將其對角線上的所有元素變為1,若能則輸出變換方法。行列進行匹配,若結果小於n則說明現存元素無法使得對角線全為1,否則作行列變換。需要清楚的是,僅通過行或列變換即可以滿足題目要求。includ...
HDU 2819 Swap(二分匹配)
題意 交換任意兩行或兩列,使主對角線全為1。分析 1 主對角線都為1,可知最終,第一行與第一列匹配,第二行與第二列匹配,2 根據初始給定的矩陣,若aij 1,則說明第i行與第j列匹配,據此求最大匹配數cnt,若cnt n,才可通過交換使主對角線都為1。3 交換時,可只交換行或只交換列。如 只交換列,...
HDU 2819 最大匹配
這個題就是給你乙個只含有0和1的矩陣,問你能否通過行列交換使得對角線上的元素全為1,首先需要注意的是我們僅通過行交換或者列交換就可以使得矩陣滿足條件,然後我們將行和列看成點,矩陣中1的元素看成邊,建立乙個有向圖,求出行列的最大匹配數,即可。如下 include using namespace std...