<强>二分图匹配实例代码及整理强>
1,匈牙利算法
1150二胺
# include# include # include 使用名称空间性病; int m, n, k; int vis [105]; int mpt [105] [105]; 使用int [105]; int匈牙利(int x) { for (int i=1; i 之前
2公里算法
2255
二胺
看了很多资料都还不是很懂,,先贴别人的模板
# include# include # include # include # include 使用名称空间性病; #定义N 310 int [N] [N]地图; bool visitx [N], visity [N]; 本部分int lx [N] [N]; int [N]匹配; int n; bool匈牙利(int u)//匈牙利算法 { visitx [u]=true; for (int i=0;我& lt;n;+ + i) { 如果(!visity[我],,lx (u) + ly[我]==地图(u)[我]) { visity[我]=true; 如果(匹配[我]==1 | |匈牙利(匹配[我])) { 匹配[我]=u; 返回true; } } } 返回错误; } 空白KM_perfect_match () { int温度; memset (lx 0 sizeof (lx));//初始化顶标 memset (ly 0 sizeof (ly));//ly[我]为0 for (int i=0;我& lt;n;+ + i)//lx[我]为权值最大的边 for (int j=0;j & lt;n;+ + j) lx[我]=max (lx[我],[我][j])地图; for (int i=0;我& lt;n;+ + i)//对n个点匹配 { 而(1) { memset (visitx,假,sizeof (visitx)); memset (visity,假,sizeof (visity)); 如果(匈牙利(i))//匹配成功 打破;//其他匹配失败,找最小值 { temp=INT_MAX; for (int j=0;j & lt;n;+ + j)//x在交错树中 如果(visitx [j]) for (int k=0;k & lt;n;+ + k)//y在交错树外 如果(!visity [k],,临时的在lx [j]地图+ ly [k] - [j] [k]) temp=lx [j] + ly [k] - [j] [k]地图; for (int j=0;j & lt;n;+ + j)//更新顶标 { 如果(visitx [j]) lx [j] -=temp; 如果(visity [j]) ly [j] +=temp; } } } } } int main () { int答; 而(scanf (“% d”,及n) !=EOF) { ans=0; memset(匹配,1,sizeof(匹配)); for (int i=0;我& lt;n;+ + i) for (int j=0;j & lt;n;+ + j) scanf (“% d”,和地图[我][j]); KM_perfect_match (); for (int i=0;我& lt;n;+ + i)//权值相加 ans +=地图匹配[我]][[我]; printf (" % d \ n”, ans); } 返回0; } >之前 3,多重匹配
HDU 3605年逃离
# include# include # include 使用名称空间性病; 整数n, m; int num [15]; int mpt [100005] [15]; int vis [15]; 使用int [15]; int dp [15] [100005]; int匈牙利(int x) { for (int i=1; i<=m;我+ +) { 如果(vis[我]==0,和mpt [x][我]==1) { vis[我]=1; 如果使用[我]& lt; num[我])//满足条件 { dp[我][使用[我]+ +]=x; 返回1; }//不满足则寻找增广路 (int j=0; j<使用[我];j + +)//看能否回溯一个出去 { 如果(匈牙利(dp[我][j])) { dp[我][j]=x; 返回1; } } } } 返回0; } int main () { 而(scanf (“% d % d”,, n,和m) !=EOF) { for (int i=1; i<=n,我+ +) { for (int j=1; j<=m; j + +) { scanf (“% d”,和mpt[我][j]); } } for (int i=1; i<=m;我+ +) scanf (“% d”, num[我]); int ans=0; 使用memset (0 sizeof(使用); for (int i=1; i<=n,我+ +) { memset (vis 0 sizeof (vis)); 如果匈牙利(i) (!) { ans=1; 打破; } } 如果(ans==0) { printf(“是的\ n”); } 其他printf (“\ n”); } 返回0; } 二分图匹配实例代码及整理