HDU 2819 Swap(二分匹配)

2022-05-08 14:00:10 字數 1516 閱讀 2877

題意:交換任意兩行或兩列,使主對角線全為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 也就是存列的配對物件的陣...