#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 110;
const int INF=0x7fffffff;
int bmap[N][N];//每次记得清空
//对于两边各50000个点,200000条边的二分图最大匹配可以在1s内出解,效果很好:)
struct HK{//用HK算法求解二分最大匹配问题(时间复杂度为sqrt(v)*e)
int nx,ny,dis;
int cx[N];//cx[i]表示左集合i顶点所匹配的右集合的顶点序号
int cy[N]; //cy[i]表示右集合i顶点所匹配的左集合的顶点序号
int dx[N];
int dy[N];
int Q[N];
bool bmask[N];
bool searchpath(){//极大最短增广路集
int front,rear;
front=rear=0;//初始化队列
dis=INF;
memset(dx, -1, sizeof(dx));
memset(dy, -1, sizeof(dy));
for(int i=1;i<=nx;i++){
if(cx[i]==-1)//左边未匹配
{
Q[rear++]=i;//将左边节点放入队列
dx[i]=0;//分层 所有潜在起点构成0层
}
}
while(front<rear){
int u=Q[front++];//u都是未匹配的
if(dx[u]>dis)break;
for(int v=1;v<=ny;v++){
if(bmap[u][v]&&dy[v]==-1){//相邻未分层构成i+1层。
dy[v]=dx[u]+1;//v对应的距离 为u对应距离加1
if(cy[v]==-1)dis=dy[v];//右侧未匹配,更新最短距离
else{
dx[cy[v]]=dy[v]+1;//右侧已经匹配,根据已匹配边回溯。分层
Q[rear++]=cy[v];//左侧已匹配点入队。
}
}
}
}
return dis!=INF;
}
int findpath(int u){//只搜索极大最短增广路集中的边
for(int v=1;v<=ny;v++){
if(!bmask[v]&&bmap[u][v]&&dy[v]==dx[u]+1){//反向搜索的过程
bmask[v]=1;
if(cy[v]!=-1&&dy[v]==dis)continue;
if(cy[v]==-1||findpath(cy[v])){
cy[v]=u;
cx[u]=v;
return 1;
}
}
}
return 0;
}
int Max_match(){
int res=0;
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
while(searchpath()){
memset(bmask, 0, sizeof(bmask));
for(int i=1;i<=nx;i++){
if(cx[i]==-1){
res+=findpath(i);
}
}
}
return res;
}
};
HK hk;
//调用的时候确定hk.nx,hk.ny,然后直接调用Max_match()就行相关推荐
Bugku中的source
进入环境后 我们首先查看源码可以得到一个flag 这肯定是个假的(已经提交过了确实是个假的) 题目提示要用Linux 这里使用的是kali 我们首先dirsearch一下这个网站 可以看到有.git文件泄露 也可以点开那个链接但是在里面没有找到flag 然后选择下载这个.git文件 然后进入这个文件夹 输入git reflog查看文件状态 可以看到有四个都有flag is here 一个一个查看git show 然后在40c6d51中发现了我们需要的fl
Hopcroft-Karp算法的代码理解
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <que
反爬虫:POST 请求参数中 Sign 的加密机制详解,并设计带 Sign 校验的网站
本文介绍了API请求中sign签名的生成原理及实现方法。sign是通过对请求参数加密生成的一串字符串,用于验证请求合法性,防止参数篡改、重放攻击和伪造请求。其生成步骤包括参数排序、拼接字符串、加盐和哈希加密。文章还演示了如何在FastAPI后端实现带sign验证的新闻网站,包括参数校验、时间戳验证和签名比对等安全措施,有效提升API安全性,增加爬虫逆向难度。
转:二分图最大匹配Hopcroft_Karp算法
<br /> <br />二分图最大匹配除了匈牙利算法还有一个Hopcroft-Karp算法,匈牙利算法的复杂的为O(ne),而Hopcroft-Karp算法的<br />复杂度为O(en^0.5)。<br /> 该算法的精髓在于同时找多条增广路进行反转。我们先用BFS找出可能的增广路,这里用到BFS层次搜索的概念,<br />记录当前结点在第几层,用于后面DFS沿增广路反转时用,然后再用DFS沿每条增广路反转。这样不停地找,直至无法找<br />到增广路为止。<br /> wiki上的说明
Hopcroft–Karp algorithm
1
Hopcroft-Karp 算法
Hopcroft-Karp算法是求二分图最大匹配的匈牙利算法的优化算法。代码虽然比匈牙利算法的代码量大,复杂一些,但时间复杂度优化不少。这里先暂记一下模板,里面有注释。日后在补上说明和讲解,其实我不会证明。学算法都只是学会了怎么用,没学懂过证明。(惭愧)。 以下第一张图是洛谷的模板题使用匈牙利的情况。 第二张是使用 Hopcroft-Karp的情况。 代码不记得是不是模板题的代码,但...
Hopcroft-Karp算法 poj-1469 COURSES
Hopcroft-karp算法 该算法由John.E.Hopcroft和Richard M.Karp于1973提出,故称Hopcroft-Karp算法。 使用情形 给定一个二分图,求其最大匹配。 原理简述 在增广匹配集时,每次寻找多条增广路径,以进一步减少时间复杂度。 步骤及示例演示 dx【】、dy【】 分别表示二分图左右不顶点的距离标号 mx【】、my【】 分别表示二分图左右部顶点的距离标号 1、我们每次从所有未匹配的左部节点开始BFS,进行距离标号。 2、对于每一个队列中的左部节点X,考虑与它相邻的所有
二分图最大匹配Hopcroft_Karp算法 及hdu2389
学二分好几天了。。以为匈牙利和KM算法够用的。。没想到我还是太天真了。晚上在切hdu 2389的时候匈牙利一直TLE。好吧!只能去网上看大牛的题解。所以就认识了Hopcroft_Karp算法(简称HK),一个二分匹配中很高效的算法。我们知道匈牙利算法复杂度为O(en),而HK为v(en^0.5),还是很快的。 大概思路:用BFS对X部分的所有未被覆盖的点进行寻找增广路,列出所
SPOJ4206Fast Maximum Matching(hopcroft-karp)
题目请戳这里 题目大意:裸的二分匹配。 题目分析:数据比较强,用来测模版的。这题用hungry跑着会比较吃力,所以用hopcroft-karp算法。这个算法较hungry高效是因为每次bfs找到一个增广路集,然后用dfs进行多路增广,同时找多条增广路,从而效率大增。其实怎么看hk算法都是个没有边权的dinic啊。 参照着wikipedia 敲了一个hk,效率貌似不高啊。。。 详情请见代码:
【运筹优化】最大二分匹配问题及两种算法详解 + Python代码实现
在最大二分匹配(MBM)问题中,给定一个二分图 G,即分左右两部分,两个部分内部的点没有边连接,要求选出一些边,使得这些边没有公共顶点,且边的数量最大。上面的描述可能比较抽象,我们可以假想成男女配对。如下图所示,男女之间的连线代表他们互相之间有好感,假设你现在是一个媒婆,你的目标是在不违反男女双方自由意志的前提下,尽可能撮合出最多对的情侣。这就是最大二分匹配问题!匈牙利算法-看这篇绝对就够了!
hdu2389+二分匹配(Hopcroft-Karp算法)
题意很简单,显然是对客人与伞做匹配,求最大匹配数。 一开始用了匈牙利,果断TLE。。。 好吧,原来二分匹配还有这个奇葩算法。。然而敲完还是不明白这个算法啥意思。。。 附两个算法的时间复杂度: 匈牙利:O(VE) H-K :O(V^0.5 E) 1 #include<cstdio> 2 #include<cstring> 3 #inclu...
二分匹配水题 POJ 1469
poj1469:http://poj.org/problem?id=1469 COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19967 Accepted: 7860 Description Consider a group of
HDU2389Rain on your Parade 二分匹配Hopcroft-Karp
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Others) Total Submission(s): 3963 Accepted Submission(s): 1320 Problem Description You’re giving a p
二分匹配加速算法(简单,就是先把能匹配的先找出来,不用Hopcroft_Karp算法)
#include<bits/stdc++.h> using namespace std; int n,m; int INF=0x3f3f3f; int dis; int cx[3003]; int dy[3002]; int cy[3003]; int dx[3003]; int used[3002]; int a[3003]; int b[3002]; int c[3002]; i...
Rain on your Parade HDU - 2389 (二分匹配,Hopcroft-Karp算法)
Rain on your Parade HDU - 2389 You’re giving a party in the garden of your villa by the sea. The party is a huge success, and everyone is here. It’s a warm, sunny evening, and a soothing wind send...
SCU 4429 frog's dice (二分匹配 or 网络流)
题目链接 4429: frog's dice Submit your solution Discuss this problem Best solutions Time: 2000ms The Problem frog has many dices:) Each dice has six surfaces and there is
二分匹配
棋盘游戏 HDU - 1281 题目链接 行与列的二分匹配,暴力删除每一点求最新的二分匹配,比原先的小那就是重要点 #include <bits/stdc++.h> using namespace std; const int N = 100 + 5; struct node{ int x,y; }s[N * N]; int Map[N][N],vis[N],link[N]; int cnt[N]; bool dfs(int x,int m) { for (int i = 1;
利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES
利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES
hdu 1068 Girls and Boys
最大二分匹配。 题目所求为最大独立集=n-最大匹配 Hopcroft-krap()算法: #include #include #include #include using namespace std; #define INF 10000000 queue q; int g[505][505]; int vis[505]; int distx[505],disty[505];
【HDU】2444 The Accomodation of Students 二分匹配
传送门:【HDU】2444 The Accomodation of Students 题目分析:能不能分成两个集合主要看这个图是否是一个二分图,
Hdu 2389 Rain on your Parade
大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再tmin内移动到不同的雨伞处(不允许两个人共用一把伞)。 思路:很容易可以看出,这是一个二分图模型,雨伞和人一一对应,典型的匹配问题,而又要求最大,所以是二分最大匹配问题,再看看题目的数据量,nx:3000,ny:3000,极限情况下有9000000条边,很明显,匈牙利算法可能会TLE,所以为了降低时间复杂度
971




被折叠的 条评论
为什么被折叠?



