題意:交換任意兩行或兩列,使主對角線全為1。
分析:1、主對角線都為1,可知最終,第一行與第一列匹配,第二行與第二列匹配,……。
2、根據初始給定的矩陣,若aij = 1,則說明第i行與第j列匹配,據此求最大匹配數cnt,若cnt==n,才可通過交換使主對角線都為1。
3、交換時,可只交換行或只交換列。如:只交換列,行不變(順序為1,2,3,……,n),那麼對於列,只需要根據選擇排序,將每行一開始匹配的列的順序最終也變成1,2,3,……,n即可,因為是選擇排序,每次選擇第i小的交換到第i個位置,因此最多隻需要交換n次。
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define lowbit(x) (x & (-x))const double eps = 1e-9;
inline int dcmp(double a, double b)
typedef long long ll;
typedef unsigned long long ull;
const int int_inf = 0x3f3f3f3f;
const int int_m_inf = 0x7f7f7f7f;
const ll ll_inf = 0x3f3f3f3f3f3f3f3f;
const ll ll_m_inf = 0x7f7f7f7f7f7f7f7f;
const int dr = ;
const int dc = ;
const int mod = 1e9 + 7;
const double pi = acos(-1.0);
const int maxn = 100 + 10;
const int maxt = 1000 + 10;
using namespace std;
int a[maxn][maxn];
bool used[maxn];
int match[maxn];
vector> v;
int n;
bool dfs(int x)}}
return false;
}int hungary()
return cnt;
}int main()
}int cnt = hungary();
if(cnt != n)
for(int i = 1; i <= n; ++i)
if(tmp == i) continue;
v.push_back(pair(i, tmp));
swap(match[i], match[tmp]);
}int len = v.size();
printf("%d\n", len);
for(int i = 0; i < len; ++i)
}return 0;
}
hdu2819 Swap 最大匹配數
題意 給定乙個n n的矩陣,格仔數字0或者1,通過交換兩行或兩列使對角線都是1。若不能,輸出 1 若可以,輸出交換次數,並且輸出交換的行或者列。如果某行或者某列全是0。那怎麼換都沒辦法的。否則,一定能換出來。這個動動腦子想一下可以明白的。其次要明確 只交換行或者只交換列都是可以換出來的。這個動動腦子...
HDU2819 Swap 匈牙利演算法 行列匹配
題目鏈結 sample output 1r 1 2 1給定乙個僅含有0與1的n階方陣,詢問是否可以通過行列變換將其對角線上的所有元素變為1,若能則輸出變換方法。行列進行匹配,若結果小於n則說明現存元素無法使得對角線全為1,否則作行列變換。需要清楚的是,僅通過行或列變換即可以滿足題目要求。includ...
HDU2819 二分匹配與矩陣的秩
題意 給出乙個矩陣問能否實現對角線全部是1,能的話輸出路徑,不能的話輸出 1 思路 首先根據矩陣的性質,這一定是乙個滿秩矩陣,所以只根據行或列交換就一定能實現。所以行和列構成二分圖,然後跑一發匈牙利就知道行不行。然後怎麼輸出交換的步驟呢,我們只考慮列交換的話,在對於陣列cy 也就是存列的配對物件的陣...