先兩邊的點增加至n+m-res, res是原圖的最大匹配,然後做一次完美匹配。新建乙個圖g,對於王子匹配的公主向該王子喜歡的其他公主連一條邊,求強連通分量,則王子喜歡的公主並且與王子匹配的公主在同乙個強聯通分量裡面都能與王子匹配並且最大匹配數不會減少。
實際上是王子之間交換各自匹配的公主,如圖
左邊是王子,右邊是公主,紅色是匹配邊,綠色是未匹配邊,藍色是新建的圖 g
因為原圖不是完美匹配,有些王子公主是單身狗,無法實現上述交換
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-9
#define mod 10007
#define for(i,s,t) for(int i = s; i < t; ++i )
#define rep(i,s,t) for( int i = s; i <= t; ++i )
#define ll unsigned long long
#define ull unsigned long long
#define pii pair#define mp make_pair
#define lson id << 1 , l , m
#define rson id << 1 | 1 , m + 1 , r
#define maxn ( 2000+100 )
#define maxe ( 2000000+10 )
#define mxn 20000
vector < int > g[maxn];
int link[maxn], lx[maxn];
bool vis[maxn];
bool dfs1( int u )
} return 0;
}int hungry( int n )
return res;
}int un, vn;
int fst[maxn], vv[maxe], nxt[maxe], ec;
void add ( int u, int v )
int sccno[maxn], scc_cnt, s[maxn], stop;
int pre[maxn], low[maxn], dfsc;
void dfs ( int u )
else if( !sccno[v] )
} if( pre[u] == low[u] ) }}
void find_scc( int n )
}vector < int > ans;
int readint ()
void out ( int x )
int main ()
} int res = hungry( n );
vn = un = n + m - res;
for( int i = n+1; i <= un; ++i )
for( int i = 1; i <= un; ++i )
for( int j = m + 1;j <= vn; ++j )
g[i].push_back( j );
hungry( un );
memset( lx, -1, sizeof( lx ) );
for( int i = 1; i <= vn; ++i )
if( link[i] != -1 )
lx[link[i]] = i;
memset( fst, -1, sizeof( fst ) );
ec = 0;
for( int i = 1; i <= un; ++i )
for( int j = 0; j < g[i].size(); ++j )
if( g[i][j] != lx[i] ) add( lx[i], g[i][j] );
find_scc( vn );
printf("case #%d:\n", cas++ );
for( int i = 1; i <= n; ++i )
sort( ans.begin(), ans.end() );
out( ans.size() );
for( int i =0; i < (int)ans.size(); ++i )
printf("\n" );
} }}
二分 二分匹配
給了乙個矩陣 n行m列 選n個數 要保證這n個數不在同行同列,計算出第k大的數最小 二分答案,然後我們對於每個a i j mid的我們就i和j建立一條邊 然後二分求最大匹配必須大於等於n k 1 因為是第k大 而不是第k小 坑了好久才發現 include include include includ...
hdu2413 二分 二分匹配
題意 地球和外星球大戰,地球有n個飛船,外星球有m個飛船,每個飛船有自己的其實戰艦和戰艦增長率,星球於星球之間有距離,問你最少多少年地球可以打敗外星球,每個星球最多只能和乙個星球對戰.思路 題意的最後一句話告訴我們這個題目滿足二分圖,我們可以二分列舉多少年打敗,每次都重新建圖,對於h i 和 a j...
hdu 1150 二分匹配
題意 給出a,b兩台機器,並且各自的工作方式有 種,給出k個任務,及其第ki個任務能夠在a,b機器上完成方式,ai,bi 機器每更換一次工作方式花費時間 1,求最小花費!思路 由於剛學二分匹配,行列匹配法,1a,有點yy。include include include includeusing na...