二分图 1
“全是板子题“——gtm1514
这样用脑子的板子题我头一次见
二分图判定板子
点击查看代码
bool dfs(int now, int fa, int color) {
col[now] = color;
for (int i = head[now]; i; i = e[i].nxt) {
int to = e[i].to;
if (to == fa) continue;
if (col[to] == 0 && !(dfs(to, now, 3-color))) {
return false;
}
if (col[to] == color) return false;
}
return true;
}
// 主函数中
bool flag = true;
for (int i = 1; i <= n; ++i) {
if (!col[i]) {
if (!(dfs(i, 0, 1))) {
flag = false;
break;
}
}
}
if (flag) cout <<"YES"<<endl;
else cout <<"NO"<<endl;
最大匹配——匈牙利算法
设
匹配:若
最大匹配:具有边数量最多的匹配称为最大匹配
最大权匹配:当图中的边带权的时候,边权和最大的为最大权匹配。
匹配中的边称为匹配边,反之称为非匹配边。
一个点如果属于
完美匹配:若
交错路:从一个未匹配的点出发,依次经过未匹配边、匹配边、未匹配边....这样的路叫做交错路。
增广路:从一个未匹配的点出发,走交错路,到达了一个未匹配过的点,这条路叫做增广路。
板子:
点击查看代码
struct G{
struct edge{
int t;
int n;
}p[o*o];
int m[o*o],cnt,h[o*o];
void add(int s,int t){
cnt++;
p[cnt].t=t;
p[cnt].n=h[s];
h[s]=cnt;
}
bool v[o*o];
bool match(int x){
for(int i=h[x];i;i=p[i].n){
int y=p[i].t;
if(!v[y]){
v[y]=1;
if(!m[y]||match(m[y])){
m[y]=x;
return true;
}
}
}
return false;
}
void work(){
for(int i=1;i<=n;i++){
memset(v,0,sizeof(G.v));
if(match(i)){
ans++;
}
}
}
}G;
最小点覆盖:
给一张二分图,求最小点集
最小点覆盖点数等于最大匹配边数
最大独立集:
大小等于节点数-最大匹配边数边数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具